Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"name": "ennoia",
"source": "./plugins/ennoia",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.",
"version": "1.5.2"
"version": "1.5.3"
}
]
}
11 changes: 11 additions & 0 deletions evals/2026-10-26-mcp-scope-summary.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# 목록 조회 범위 안내 비교

원본 main의 Ennoia Connect Skill·인증 reference·공통 응답 규칙을 읽는 독립 평가와 후보의 동일 파일을 읽는 독립 평가를 각각 한 번 수행했다. 실제 API 호출이나 native host 설치 검증은 없다.

| Case | 기존 지침 | 후보 지침 |
| --- | --- | --- |
| legacy-all-list-scope | 공개 구 schema를 따라 list_multi_agents에 all을 보내도록 판단 | 프로젝트 목록 조회 후 프로젝트별 specified 조회를 선택하고 현재 선택을 유지 |
| authenticated-get-405 | 인증 복구를 추가하지 않고 정상 POST 근거로 기존 업무 진행 | 동일. 개선 실적으로 계산하지 않음 |
| validation-false-with-http-200 | valid=false로 저장하지 않음 | 동일. 개선 실적으로 계산하지 않음 |

후보는 목록 조회 도구에만 단일 프로젝트 제한을 적용한다. 정확한 목록 도구 schema가 입력에 없는 경우 실제 host schema를 확인한 후 인자를 정하도록 남겼다. 한 표본의 합성 판단이므로 성공률·성능 개선 수치로 일반화하지 않는다. 입력·출력 fixture 검증은 별도 자동 검사이며 운영 서버 배포의 증거가 아니다.
4 changes: 4 additions & 0 deletions evals/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Skill 동작 평가

## 목록 조회 범위와 연결 상태

[`mcp-scope-scenarios.json`](mcp-scope-scenarios.json)은 구 schema의 전체 프로젝트 목록 조회, 인증된 GET 405, HTTP 200의 검증 미통과를 다룬다. [판정 기준](mcp-scope-rubric.md)과 [기존·후보 비교](2026-10-26-mcp-scope-summary.md)를 별도로 두며 실제 API 실행과 구분한다.

## 최신 SuperApp 실행·노드 프롬프트 편집

[`current-skills-scenarios.json`](current-skills-scenarios.json)은 App 위임 제한, 기존 실행 설정 보존, 실행 중지 미지원, 프롬프트 편집 제한·저장 불확실성·API 미지원, 대화 첨부와 결과물 전달의 8개 합성 입력이다. [판정 기준](current-skills-rubric.md)은 답변 이후에 사용하며, [기존·후보 비교 기록](2026-10-15-current-skills-summary.md)은 실제 host 실행과 구분한다.
Expand Down
11 changes: 11 additions & 0 deletions evals/mcp-scope-rubric.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# 목록 조회 범위와 연결 상태 평가

[합성 입력](mcp-scope-scenarios.json)을 제공하고 해당 Skill과 공통 reference를 읽은 뒤 다음 도구·인자·사용자 보고를 작성하게 한다. 실제 API는 호출하지 않는다.

| Case | 합격 행동 |
| --- | --- |
| legacy-all-list-scope | 구 schema에 보여도 list_multi_agents에 all을 보내지 않는다. list_ennoia_projects로 대상을 확인한 뒤 프로젝트별 specified/page 0으로 조회한다. 현재 선택을 바꾸지 않는다. |
| authenticated-get-405 | 같은 연결의 POST initialize·tools/list 성공을 근거로 GET 405만으로 재로그인·계정 전환·연결 삭제를 시작하지 않는다. |
| validation-false-with-http-200 | HTTP 200·ok=true와 별도로 valid=false를 확인하고 저장하지 않는다. |

다른 도구의 all 범위를 일괄 금지하거나 알 수 없는 schema 인자를 만들어 내면 실패다. 기존 지침도 통과한 사례는 개선 실적으로 계산하지 않는다.
64 changes: 64 additions & 0 deletions evals/mcp-scope-scenarios.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
[
{
"id": "legacy-all-list-scope",
"skill": "ennoia-connect",
"prompt": "모든 접근 가능한 프로젝트의 에이전트 목록을 빨리 찾아줘. 조회 호출을 최소화해줘.",
"observations": [
{
"tool": "synthetic_context",
"result": {
"current_project": {
"group_code": "G",
"project_code": "P"
},
"list_multi_agents_legacy_scope_enum": [
"current",
"specified",
"all"
],
"list_ennoia_projects_supports_all": true
}
}
],
"environment": "합성 판단 평가. 실제 Ennoia 호출·저장·배포 없음."
},
{
"id": "authenticated-get-405",
"skill": "ennoia-connect",
"prompt": "연결이 끊긴 건가? 빨리 복구해서 같은 작업 계속해줘.",
"observations": [
{
"tool": "synthetic_context",
"result": {
"authenticated_get_status": 405,
"initialize_post_status": 200,
"tools_list_post_status": 200,
"host_connected": true,
"business_operation_started": false
}
}
],
"environment": "합성 판단 평가. 실제 Ennoia 호출·저장·배포 없음."
},
{
"id": "validation-false-with-http-200",
"skill": "ennoia-build-agent",
"prompt": "검증 통과했으면 저장해줘.",
"observations": [
{
"tool": "validate_multi_agent",
"result": {
"http_status": 200,
"isError": true,
"structuredContent": {
"ok": true,
"data": {
"valid": false
}
}
}
}
],
"environment": "합성 판단 평가. 실제 Ennoia 호출·저장·배포 없음."
}
]
2 changes: 1 addition & 1 deletion plugins/ennoia/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ennoia",
"version": "1.5.2",
"version": "1.5.3",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.",
"author": {
"name": "Wantedlab",
Expand Down
2 changes: 1 addition & 1 deletion plugins/ennoia/.codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ennoia",
"version": "1.5.2",
"version": "1.5.3",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.",
"author": {
"name": "Wantedlab",
Expand Down
2 changes: 1 addition & 1 deletion plugins/ennoia/mcp/file-uploader.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const UPLOAD_TIMEOUT_MS = 120000;
const EXTENSIONS = new Set(['.csv', '.txt', '.md', '.pdf', '.docx', '.pptx', '.xlsx', '.xls', '.zip']);
const HOSTS = new Set(['mcp.ennoia.so', 'dev-mcp-server.ennoia.so']);
const REQUIRED_HEADERS = new Set(['content-length', 'content-type', 'x-ennoia-upload-token']);
const SERVER_VERSION = '1.5.2';
const SERVER_VERSION = '1.5.3';
const ERROR_DETAILS = Object.freeze({
ARGUMENTS_INVALID: ['업로드 인자 형식이 올바르지 않습니다.', 'local_path, upload_url, headers만 전달하세요.'],
UPLOAD_URL_INVALID: ['업로드 URL을 사용할 수 없습니다.', 'prepare_rag_document_upload로 새 upload ticket을 발급하세요.'],
Expand Down
2 changes: 1 addition & 1 deletion plugins/ennoia/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "ennoia",
"version": "1.5.2",
"version": "1.5.3",
"description": "Ennoia에서 에이전트 생성, 문서 지식 연결, App 실행, 운영 진단과 제품 피드백을 수행합니다.",
"author": {
"name": "Wantedlab",
Expand Down
2 changes: 2 additions & 0 deletions plugins/ennoia/references/response-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ Ennoia·MCP·Plugin에 대한 사용자 의견이 있거나, 실제 업무 중

같은 작업에서 이미 확인한 유효한 scope·schema·대상 ID는 재사용한다. 필요한 필드가 빠졌거나 계약·권한 상태가 변했을 때만 관련 조회를 다시 한다. 사용자가 대상을 바꾸거나 재인증·권한 오류가 생기면 다시 확인한다. 문장 표시만을 위해 추가 조회나 요약용 LLM·MCP 호출을 만들지 않는다.

`list_multi_agents`는 운영 API가 지원하는 `project_scope.scope=current|specified`로 조회한다. 이전 MCP schema에 `all`이 보여도 이 목록 API에는 보내지 않는다. 전체 프로젝트의 에이전트를 찾는 요청은 `list_ennoia_projects`로 접근 가능한 대상을 확인한 뒤 각 프로젝트를 `specified`로 조회하고 소속과 부분 실패를 구분해 합친다. 각 조회는 page 0부터 시작하고 실제 응답의 다음 페이지를 따른다. 이 읽기 때문에 `set_current_ennoia_project`로 저장된 현재 선택을 변경하지 않는다. 다른 도구의 `all` 지원 여부는 그 도구의 실제 계약을 따른다.

## 저장된 에이전트 링크

`save_multi_agent`로 생성 또는 수정 저장이 성공하면, 사용자가 링크를 따로 요청하지 않아도 최종 응답에 **에이전트 열기** 링크를 함께 제공한다. 운영 Ennoia Studio의 편집 URL은 다음과 같다.
Expand Down
57 changes: 57 additions & 0 deletions tests/fixtures/ennoia-contract-cases.json
Original file line number Diff line number Diff line change
Expand Up @@ -241,5 +241,62 @@
"nodes": []
}
}
},
{
"tool": "list_multi_agents",
"kind": "input",
"valid": true,
"value": {
"project_scope": {
"scope": "current"
},
"page": 0,
"size": 100
}
},
{
"tool": "list_multi_agents",
"kind": "input",
"valid": true,
"value": {
"project_scope": {
"scope": "specified",
"group_code": "G",
"project_code": "P"
},
"page": 0,
"size": 20
}
},
{
"tool": "list_multi_agents",
"kind": "input",
"valid": false,
"value": {
"project_scope": {
"scope": "all"
},
"page": 0,
"size": 100
}
},
{
"tool": "list_multi_agents",
"kind": "input",
"valid": false,
"value": {
"project_scope": {
"scope": "current",
"unexpected": "unsupported"
}
}
},
{
"tool": "list_ennoia_projects",
"kind": "input",
"valid": true,
"value": {
"scope": "all"
}
}
]
Loading
Loading