Skip to main content
Glama

mcp-server-and-agent

JSON-RPC 수준에서 직접 작성한 MCP 서버, 그 위의 네 가지 에이전트 토폴로지, 그리고 통제된 장애 모델 하에서 각각의 실패율을 측정한 결과입니다. 에이전트의 두뇌는 실제 LLM이 아닌 결정론적 시뮬레이션입니다 — 스크립트된 정책이 실제 MCP 서버 위에서 계획을 실행하고, 매개변수화된 장애 프로세스가 명시된 비율로 그 선택을 교란합니다. 이것은 절충이 아니라 측정 도구입니다: 실제 모델에 대해 측정한 토폴로지의 실패율은 그 모델의 비결정성에 의해 혼동되며, 그 차이가 토폴로지에서 왔는지 샘플러에서 왔는지 구분할 수 없습니다. 아래의 모든 수치는 장애 모델 하의 토폴로지의 실패율이지, 어떤 실제 모델의 실패율이 아닙니다.

이 저장소는 한 가지 질문에 답합니다:

각 에이전트 토폴로지의 실패율은 얼마이며, supervisor가 실제로 single-agent보다 나은가?

답

Supervisor는 single-agent보다 낫지만, 그 비용 대비 이득은 작고, 두 가지 더 단순한 설계에 지배됩니다.

토폴로지

실패율

토큰/실행

single 대비

단계

핸드오프

single

31.7%

2,449

1.00x

5.44

0.00

supervisor

28.2%

4,238

1.73x

5.16

3.88

pipeline

21.2%

3,244

1.32x

5.37

1.66

reflexive

4.5%

2,996

1.22x

6.31

0.32

토폴로지당 600회 실행(6개 작업 x 100회 시도), 모든 토폴로지가 주어진 (작업, 시도)에 대해 동일한 장애 스트림을 마주합니다 — 독립적인 네 개의 표본이 아니라 짝지은 비교입니다.

  • Supervisor의 3.5포인트 이득은 실제이며 노이즈가 아닙니다: 짝지은 부트스트랩 델타 -0.035 [-0.062, -0.008] (95% 신뢰구간, 구간이 0을 제외).

  • 비용은 토큰 1.73배입니다. pipeline과 reflexive는 둘 다 실패율 그리고 토큰에서 이를 능가합니다. 세 번째로 좋은 결과를 위해 1.7배를 지불하는 것이 발견입니다.

  • 순위 reflexive < pipeline < supervisor < single은 장애율의 0.5x–2.0x 스윕 전반에 걸쳐 유지됩니다.

  • 장애가 증가할수록 격차는 좁아집니다. 토폴로지는 2차 효과이고, 도구 신뢰성이 1차 효과입니다.

전체 표, 신뢰구간 및 민감도 스윕: results/topologies.md. 모든 숫자는 scripts/generate_results.py에 의해 생성되며, 이 스크립트는 자체 주장을 검증하고 위반 시 0이 아닌 종료 코드로 종료합니다.

Related MCP server: agentloop

더 유용한 답

위의 혼합 장애 모델 하에서 토폴로지들은 비슷해 보입니다. 한 번에 하나의 장애를 높이면 극적으로 달라집니다 — 그리고 어떤 토폴로지가 도움이 되는지는 전적으로 어떤 장애가 있는지에 달려 있습니다:

실패 모드

최고

최악

토폴로지가 답인가?

무한 루프

supervisor 0.0%

single 24.6%

예 — 단위당 단계 예산

도구 잘못 선택

reflexive 15.0%

pipeline 44.2%

아니요 — 스키마 수정

오류 연쇄

reflexive 21.7%

pipeline 56.7%

아니요 — 오류 메시지 수정

컨텍스트 소진

supervisor 0.0%

single 83.8%

예 — 새 컨텍스트

부분 실패

—

—

아니요 — 저널 및 보상

확인되지 않은 파괴

—

—

아니요 — 도구 게이트

여섯 가지 중 두 가지는 토폴로지로 해결되며, 둘 다 동일한 속성 — 작업 단위당 리소스 격리, 감독 자체가 아니라 — 에 의해 해결됩니다. 나머지 네 가지는 도구 계층에서 해결됩니다. supervisor와 pipeline이 오류 연쇄에서 single보다 더 나쁘다는 점에 주목하십시오: 새 작업자 컨텍스트는 반복 호출을 하지 말라고 알려줄 오류 기록을 버립니다. 격리는 연쇄를 포함하지만 학습도 절단합니다.

판단 산출물, 재현 시드, 실제 추적 및 모드별 완화 조치: docs/failure-taxonomy.md.

범위

의도적으로 좁습니다. 범위 내: MCP 프로토콜 표면, 네 가지 토폴로지, 여섯 가지 실패 모드, 각각의 토큰 비용. 범위 외: 위 질문에 답하는 데 도움이 되지 않는 모든 것.

빠른 시작

uv sync --extra dev
uv run pytest -q                          # 90 tests
uv run python scripts/generate_results.py # regenerates results/
uv run python scripts/find_failure_seeds.py

stdio를 사용하는 모든 클라이언트에 대해 MCP 서버 실행:

uv run python -m mcp_server_and_agent.server

포함 내용

파일

설명

src/.../protocol.py

JSON-RPC 2.0 프레이밍, 오류 객체, 요청 검증

src/.../server.py

MCP 수명주기, 디스패치, 멱등성 중복 제거, stdio 루프

src/.../tools.py

5개 도구, 1개 리소스, 1개 프롬프트, 확인 게이트, 롤백 저널

src/.../faults.py

장애 모델 — 실험의 독립 변수

src/.../agent.py

스크립트된 정책, ReAct 루프, 작업 집합

src/.../topologies.py

네 가지 토폴로지

MCP 서버는 SDK가 아닌 스펙에 맞춰 작성되었습니다

initialize / tools/list / tools/call / resources/read / prompts/get / ping, 올바른 -32700 / -32600 / -32601 / -32602 / -32603 오류 객체 포함. 이유는 순수함이 아닙니다: SDK는 이 저장소가 측정하는 바로 그 이음새를 숨깁니다. 프로토콜 준수는 에이전트 스택에서 정확히 테스트 가능한 몇 안 되는 것 중 하나입니다 — 잘못된 요청에는 정확히 하나의 올바른 오류 코드가 있습니다 — 따라서 tests/test_protocol_conformance.py는 행복 경로 구현이 틀리는 경우를 다룹니다: 알림에 응답이 없는 경우, "id": null이 알림이 아닌 요청인 경우, 배치 거부, 그리고 아래 경계.

존재하지 않는 도구는 -32602입니다. 존재하지만 실패하는 도구는 isError를 담은 성공 응답입니다. 첫 번째는 클라이언트의 버그이고, 두 번째는 에이전트가 행동할 수 있는 피드백입니다. 이 둘을 합치면 에이전트는 고칠 수 없는 호출을 영원히 재시도하거나 복구 가능한 호출을 포기하게 됩니다.

네 가지 토폴로지

  • single — 하나의 에이전트, 전체 도구 목록, 전체 계획. 기준선.

  • supervisor — 감독자가 각 단계를 새 작업자에게 디스패치합니다. 각 디스패치는 작업자가 콜드 스타트이므로 핸드오프 비용을 지불합니다.

  • pipeline — 고정된 discover → fetch → aggregate 체인. 잘못될 라우팅 결정이 없고, 단계 실패 시 재계획자가 없습니다. 컨텍스트 스레드는 앞으로 전달됩니다.

  • reflexive — 단일 에이전트에 정확히 한 번의 반성 및 재시도 패스를 더한 것. 네 번째로 선택된 이유는 supervisor가 혼동하는 것을 분리하기 때문입니다: **두 번째 시도가 두 번째 에이전트보다 더 가치 있는가.** 둘 다 추가 토큰이 들지만, 이 장애 모델 하에서 오직 하나만 기능을 추가합니다.

출처

이 README의 모든 숫자는 커밋된 스크립트에서 나옵니다.

  • 날짜: 2026-08-25

  • 하드웨어: 24코어 CPU, 32 GB RAM, GPU 없음

  • 모델: simulated-scripted-policy — LLM 미사용

  • 시드: 20260825

  • 재현: python scripts/generate_results.py

  • 원시 산출물: results/topologies-raw.md (gitignore됨 — 작업별 세부 정보)

  • 커밋된 산출물: results/topologies.md

CI는 results/를 재생성하고 git diff --exit-code에서 실패하므로, 수동으로 편집된 숫자는 빌드를 깨뜨립니다. 이 게이트는 실험이 결정론적이기 때문에만 의미가 있습니다 — 동일한 시드, 동일한 장애율 — tests/test_topologies.py가 양방향으로 이를 검증합니다.

한계

  • 어떤 측정에도 LLM이 관여하지 않았습니다. 에이전트 두뇌는 스크립트된 정책이고 장애는 제가 선택한 분포에서 추출됩니다. 이는 통제된 장애 모델 하의 토폴로지의 실패율이지, 실제 배포의 어떤 실제 모델의 실패율이 아닙니다. 전이되는 것은 결과의 형태 — 어떤 완화가 어떤 메커니즘을 공격하는지 — 이지 값이 아닙니다.

  • 장애율은 보정되지 않았습니다. 여기서 실제 에이전트가 16%의 확률로 도구를 잘못 선택한다는 것을 입증하는 것은 없습니다. 보정하려면 이 저장소가 의도적으로 수행하지 않는 실제 실행이 필요하며, 누군가 그렇게 하기 전까지 절대 비율은 임의적이고 비교만 의미가 있습니다.

  • 토큰 수는 합성입니다: 단계당 고정 비용에 관찰에 대해 len(text)//4를 더한 값. 토폴로지 간에 일관되므로 비율은 유지됩니다. 달러 수치는 누구의 청구서도 예측하지 않습니다.

  • 여섯 가지 작업, 하나의 서버, 하나의 작업 형태. 여섯 가지 모두 검색-후-가져오기-후-집계입니다. supervisor가 이겨야 하는 경우 — 진정으로 병렬적이고 분리 가능한 하위 작업 — 여기서 표현되지 않으며, 이 숫자는 그에 대한 반증이 아닙니다. 이것이 저장소가 확립하지 못한 가장 큰 것입니다.

  • reflexive는 다른 것들이 갖지 못한 재시도 한 번을 받습니다. 이점의 일부는 반성 자체가 아니라 장애 분포에서 두 번째 추첨입니다.

  • LangGraph 없음. 브리프가 언급했지만, 여기 에이전트 루프는 ~200줄로 직접 작성되었습니다. 연구 대상 실패 모드가 루프의 속성이고, 프레임워크는 단계 상한, 컨텍스트 회계 및 연쇄 감지기를 다른 사람의 구현 세부 사항으로 만들었을 것이기 때문입니다.

  • 탐지는 측정되었고, 복구는 대부분 측정되지 않았습니다. 롤백 경로를 제외하고, 이는 실패가 포착된다는 것을 확립하지만, 이러한 완화를 기반으로 구축된 시스템이 더 많은 작업을 완료한다는 것은 확립하지 않습니다.

기반

  • llm-client-kit v0.1.0 — 토큰 및 지출 회계를 위한 CostLedger.

  • llm-eval-harness v0.1.0 — 신뢰구간을 위한 stats.paired_delta_ci 및 is_reportable, 출처 블록을 위한 types.RunMeta.

라이선스

MIT — LICENSE 참조.

Available Tools

5 tools
append_noteB

Append a free-text note to the session note log.

NameRequiredDescriptionDefault
textYesnote body

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=false and destructiveHint=false, so safety is covered. The description adds only the fact it appends to a log but does not disclose side effects, permissions, or failure behavior. Given the annotations, the description contributes minimal value beyond the obvious write nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no extraneous detail. It efficiently conveys the core action and object.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and no output schema, the description is minimally adequate. However, it does not mention typical usage scenarios, return behavior, or failure modes, which could be helpful for an agent deciding whether this tool fits a given task.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameter 'text' is documented as 'note body'. The description's phrase 'free-text note' adds a slight nuance about the unstructured nature of the input, but does not materially extend the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Append') with a clear resource ('session note log') and describes the content ('free-text note'). It is easily distinguished from the sibling tools (search_records, fetch_record, summarise_amounts, delete_record) which perform different actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives. It does not mention any prerequisites, exclusions, or typical workflows where appending a note would be appropriate over other operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_recordA
Destructive

Permanently delete a record. Destructive and gated: the first call returns a confirm_token describing what would be deleted, and the deletion only happens on a second call carrying that token.

NameRequiredDescriptionDefault
record_idYesexact record id to delete
confirm_tokenNotoken from the prior unconfirmed call

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as destructive and non-idempotent, and the description adds substantial context: permanence, the two-step confirmation mechanism, and the token's role. This is exactly the behavioral detail an agent needs beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tightly packed sentence that front-loads the destructive nature and then explains the gating protocol. There is no filler, and every clause carries essential behavioral information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive two-step tool with no output schema, the description covers the critical interaction flow and irreversibility. It stops short of specifying the shape of the token response or any post-deletion confirmation, but the essential calling protocol is fully conveyed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% parameter coverage, describing record_id and confirm_token clearly. The description reinforces the confirm_token semantics but does not add new parameter-level detail beyond what the schema already contains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the exact operation ('Permanently delete a record') with a clear resource and irreversible effect. The description also distinguishes this from the sibling read/summarize/append tools by emphasizing deletion and the confirmation gate.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates that deletion is not immediate: the first call generates a confirm_token and only a second call with that token actually deletes. It implicitly tells an agent to never expect deletion on the first call, though it does not explicitly enumerate when not to use the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_recordA
Idempotent

Fetch one record by its exact id. Returns the record's title, owner, amount and tags.

NameRequiredDescriptionDefault
record_idYesexact record id, e.g. rec-001

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and destructiveHint=false, covering the safety profile. The description adds value by disclosing that the response includes title, owner, amount, and tags, which is beyond structured annotations and helps the agent set expectations for the returned data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the operation and its result with no filler. Every word contributes meaning, and the structure is easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read operation, the description is complete: it names the input, explains the match criterion, and lists the returned fields. The output schema is absent, but the description explicitly fills that gap. Sibling distinctions are evident through the 'exact id' wording, and the annotations cover behavioral safety.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with record_id already documented as an exact record id with an example. The description merely reinforces the schema rather than adding new semantic detail. Baseline of 3 is appropriate because the schema carries the parameter meaning and the description adds minimal extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Fetch'), a resource ('one record'), and the lookup key ('exact id'), which clearly differentiates it from the sibling search_records. The added return-field list further clarifies the tool's scope. This is a precise, unambiguous definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'by its exact id' implies the proper context: when the caller already knows the precise identifier. It does not explicitly name alternatives like search_records for fuzzy or filtered lookup, but the context is clear enough for an agent to select this tool over the siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_recordsA
Idempotent

Search the record store by a free-text query matched against title, owner and tags. Returns matching record ids.

NameRequiredDescriptionDefault
queryYesfree-text search term

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate idempotent and non-destructive behavior. The description adds useful behavioral detail: it specifies what fields are matched, that the query is free-text, and that the result is a set of record ids. This is meaningful context beyond the annotations, especially since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences with no redundant wording. The action and scope are front-loaded, and every phrase contributes useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, non-destructive search tool with idempotency annotations, the description covers the core behavior and return value sufficiently. Minor details like pagination, ordering, or empty-result behavior are absent, but they are not essential for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema fully documents the query parameter as a 'free-text search term'. The description adds semantic value by explaining that the term is matched against title, owner, and tags, which clarifies how the parameter is interpreted beyond the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search') and resource ('record store'), and further clarifies the scope by naming the matched fields (title, owner, tags) and the output (matching record ids). This clearly distinguishes search_records from siblings like fetch_record and delete_record, which imply direct record retrieval or mutation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this tool is for free-text, field-matching search across records. It gives enough context for an agent to select it for search-style queries, though it does not explicitly contrast it with fetch_record or other alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

summarise_amountsA
Idempotent

Compute count, total and mean of the amount field across the given record ids. All ids must exist.

NameRequiredDescriptionDefault
record_idsYeslist of exact record ids

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare idempotentHint=true and destructiveHint=false, and the description does not contradict them. It adds meaningful behavioral context beyond annotations by stating the precondition that all ids must exist and by naming the calculated summary values, which is especially valuable because no output schema is provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences with no filler: the first states the operation and its outputs, and the second states the single relevant precondition. The key information is front-loaded and easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter, non-destructive, idempotent aggregation tool, the description is complete: it states what is computed, over which input, and the required precondition. Although there is no output schema, naming count, total, and mean sufficiently describes the return values.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% because the input schema already describes record_ids as 'list of exact record ids'. The description adds the role of the ids in the aggregation and mentions the 'amount field', but it does not provide deeper parameter-level detail, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Compute') and identifies the resource ('amount field') and the scope ('given record ids'), clearly distinguishing this as an aggregation tool from the sibling fetch/search/mutation tools. It also enumerates the three outputs (count, total, mean), leaving no ambiguity about what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: an agent can infer this tool is for summarizing amounts across a known set of record ids, and the precondition 'All ids must exist' adds a useful constraint. However, it does not explicitly contrast with alternatives like search_records or fetch_record, nor state when this tool should be preferred over them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updatesv0.1.0
    • First observedappend_note
    • First observeddelete_record
    • First observedfetch_record
    • First observedsearch_records
    • First observedsummarise_amounts

TDQS

A4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool performs a distinct action: searching, fetching by ID, aggregating amounts, appending notes, and deleting records. There is no overlap or ambiguity between them.

Naming Consistency5/5

All tool names consistently follow the verb_noun pattern (search_records, fetch_record, summarise_amounts, append_note, delete_record), using uniform snake_case naming.

Tool Count5/5

With 5 tools, the surface is well-scoped and covers essential operations without bloat or unnecessary duplication. The count is appropriate for a focused record management server.

Completeness3/5

The tools cover search, fetch, aggregation, note appending, and deletion, but lack create and update operations. While the server may be intentionally read-only plus deletion, the asymmetry is a notable gap for a record management domain.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers