Skip to main content
Glama

AniNest · aninest-mcp

CI Python License: MIT

一个基于 MCP(Model Context Protocol,模型上下文协议) 的只读能力服务器,提供十个工具: 按中文描述找插画、按角色名查竞技场作业、用头像认角色、检索本地记忆、探活本机服务。

任何支持 MCP 的宿主(Claude Desktop、Cursor、自研 Agent、CI 脚本)都可以直接调用, 不需要知道背后是哪个图站、哪个本地服务、哪个游戏。

  • 传输:stdio(桌面客户端)与 streamable-http(远端调用)

  • 协议:2025-11-25,十个工具全部带 title 与 annotations

  • 依赖:Python 3.10+,mcp 1.x,httpx;识图额外需要 pillow + numpy

快速开始

Windows,不想碰命令行:下载 ZIP 解压 → 双击 install.cmd。脚本会建独立环境、装依赖、 自检一次握手,并打印可直接粘贴的客户端配置。

# 等价用法(加 -WriteClaudeConfig 会顺手写好 Claude Desktop 配置)
.\install.ps1 -Mirror https://pypi.tuna.tsinghua.edu.cn/simple

任何系统,用命令行:

pip install "git+https://github.com/moriruruka/aninest-mcp.git"
aninest-mcp                      # stdio 模式,等宿主连接

容器:

docker build -t aninest-mcp .
docker run --rm -p 127.0.0.1:8765:8765 -e ANINEST_MCP_TRANSPORT=streamable-http aninest-mcp

本仓库不发布到 PyPI,pip install aninest-mcp 会 404;装法就是上面这几条。 装不上的排查、镜像加速、卸载、干净环境验证:安装说明。

Related MCP server: dynamic-discord-bot-api-mcp

工具

工具

典型请求

返回

art_search

"来两张初音未来泳装的竖图"

图片链接 + 用到的 tag + 是否放宽过条件

arena_lookup

"布丁、克总、真琴、纺希、莉莎这队作业"

别人用的防守阵容(含角色名)与票数

character_lookup

"布丁和克总分别是哪个角色"

角色名、六位 id、四位数 uid、别名

portrait_identify

"这几张头像分别是谁"

每张头像的候选角色与相似度

memory_search

"上次说的那个配色偏好还记得吗"

记忆条目 + 打分 + 范围(本会话/全局)

memory_stats

"记忆存了多少了"

行数、范围分布、库大小

service_health

"服务都活着吗"

五个本地端口的连通性

character_match

"宫紫 是哪个角色"(表里没有)

按名字相似度排的候选、分数、命中方式

character_update

"日服刚出的新角色,加一下"

写本地覆盖层,返回角色与别名变更

character_correct

"宫紫 就是宫子,记住"

把这个词记成别名,留一条带时间的更正记录

阵容可以直接说人话:角色名、黑话、四位数 uid、六位 id 混着写都行(布丁 克总 100301),一队 5 人。 查不到作业时,同一次调用就能带上"排除某角色"或"把 A 换成 B"再查:

{ "defense": ["布丁", "克总", "真琴"], "exclude": ["真琴"] }
{ "defense": ["布丁", "克总", "真琴"], "replace": ["布丁->怜"], "region": 1 }

读与写

前七个工具只读:不写调用方的数据、不发消息、不动账号。 character_update / character_correct 只写本地覆盖层(默认 ~/.aninest/pcr_overlay.json, 可用 ANINEST_PCR_OVERLAY 改路径),不碰随包分发的角色表、记忆库和网络。 两者在 annotations 里标了 readOnlyHint=false、destructiveHint=false, 宿主可以据此只对它们要求用户确认。

参数细节、返回字段、报错含义:使用说明。

保持角色表是新的

新角色通常先在日服上线,中文译名要过一阵才有人用。拿到日文名就先 character_update(jp="ミヤコ") 登记,character_lookup / character_match 马上能按日文名查到。 匹配错了不用新建角色:先 character_match 看候选和分数,让用户挑,再 character_correct(term, char_id) 把这个叫法记下来。两处改动都只写覆盖层, 包内 src/aninest/data/pcr_chars.json 不动,升级也不会被覆盖。

演示

一段对话,不需要任何客户端:

python demo/story.py

它自己起一个示例记忆库和假作业服务,连上 server,输出一轮完整对话:

你   > 布丁、克总、真琴、纺希、莉莎这个防守,把布丁换成怜,再查一次
host > 按 1号位 怜 / 2号位 克莉丝提娜 / 3号位 真琴 / 4号位 纺希 / 5号位 莉莎 查(把 宫子 换成 怜):
       找到 2 支队伍,最热门的是 优衣 / 香织(夏日) / 绫音 / 日和 / 矛依未(新年)(赞 1、踩 0)。

demo/host.py 是最小宿主:一句话 → 选工具 → 把 JSON 说成人话。它故意不用大模型, 用确定性关键词路由,所以不需要 API key 就能复现。换成真模型做这两步,就是任何 MCP 客户端的日常。

一张截图 → 一套阵容(宿主侧胶水示例):

python demo/screenshot_lineup.py shot.png --grid 5x3 --rows 1

流程是 截图 → 按格子裁出头像 → portrait_identify → arena_lookup。 裁图这一步故意留在宿主侧:每个宿主的截图尺寸、UI 版本、可见行数都不一样, 而 server 只回答"这张裁好的头像图是谁"。号位从右往左数(1 号位是最右边的前卫), 默认 --order rtl,也可以用 --boxes "x,y,w,h;..." 钉死矩形。

接入客户端

Claude Desktop(claude_desktop_config.json):

{
  "mcpServers": {
    "aninest": {
      "command": "aninest-mcp",
      "env": {
        "ANINEST_BOORU_URL": "https://safebooru.org/index.php",
        "ANINEST_MEMORY_DB": "C:/Users/you/.aninest/memory.db"
      }
    }
  }
}

通用 stdio 客户端:命令 aninest-mcp(或 python -m aninest),传输 stdio,没有必填参数。

HTTP 客户端(远端或容器):

ANINEST_MCP_TRANSPORT=streamable-http ANINEST_MCP_PORT=8765 aninest-mcp
# 然后连 http://127.0.0.1:8765/mcp

DSH(DeepSeek Harness):把下面这段加进 profile 的 cordis.patch.yml,重启后工具以 mcp__aninest__art_search 这样的名字出现:

- id: mcp-aninest
  name: '@deepseek-ai/dsh-mcp-client'
  config:
    serverName: aninest            # 工具前缀,命名空间内唯一
    transport: stdio
    command: python
    args: ['-m', 'aninest']
    env:
      ANINEST_MEMORY_DB: 'C:/Users/you/.aninest/memory.db'

自检脚本(不需要任何客户端):

python scripts/mcp_smoke.py                  # 列工具 + 调 service_health
python scripts/mcp_smoke.py --call art_search --args '{"query":"初音未来 泳装","count":1}'

配置

全部通过环境变量注入,仓库里没有任何凭证文件(见 .env.example)。

变量

默认值

说明

ANINEST_MCP_TRANSPORT

stdio

stdio / streamable-http / sse

ANINEST_MCP_HOST / ANINEST_MCP_PORT

127.0.0.1 / 8765

仅 HTTP/SSE 模式生效

ANINEST_BOORU_URL

https://safebooru.org/index.php

任何 Gelbooru 风格 JSON API

ANINEST_HTTP_TIMEOUT

15

秒

ANINEST_USER_AGENT

aninest-mcp/0.4.2 (+…)

图站要求可识别的 UA

ANINEST_ARENA_URL

http://127.0.0.1:6191

作业查询服务(见下文"本机依赖")

ANINEST_MEMORY_DB

~/.aninest/memory.db

只读打开

ANINEST_PROBE_HOST

127.0.0.1

健康探测目标

ANINEST_PCR_AVATARS

(空)

头像目录 <六位 id>.webp;不配则 portrait_identify 明确报错

ANINEST_PCR_OVERLAY

~/.aninest/pcr_overlay.json

两个写工具落盘的位置

本机依赖与替身

十个工具里,只有 arena_lookup 依赖一个不在本仓库内的本机服务(持登录态的浏览器进程), 其余工具都能独立验证。没有那个服务时,用仓库自带的替身跑同一套契约:

工具

依赖

没有依赖时怎么验证

art_search

公网图站(默认 safebooru)

直接可用;离线评测覆盖 tag 编译

character_lookup / character_match

无(角色表随包分发)

直接可用

character_update / character_correct

无(只写覆盖层)

直接可用;把 ANINEST_PCR_OVERLAY 指到临时文件

portrait_identify

头像包 + pip install -e ".[vision]"

scripts/make_demo_avatars.py --out demo_avatars

memory_search / memory_stats

一个 SQLite 文件

python scripts/make_demo_db.py --out demo_memory.db

arena_lookup

POST /search 服务

python scripts/fake_arena.py --port 6192(同契约假数据)

service_health

无

五个端口全 down 也是合法结果

两分钟复现:

# 1) 记忆工具:造一个示例库再查
python scripts/make_demo_db.py --out demo_memory.db
ANINEST_MEMORY_DB=./demo_memory.db python scripts/mcp_smoke.py --call memory_stats

# 2) 作业查询:起假服务,再走真实 MCP stdio 调用
python scripts/fake_arena.py --port 6192 &
ANINEST_ARENA_URL=http://127.0.0.1:6192 python scripts/mcp_smoke.py --call arena_lookup \
  --args '{"defense":["布丁","克总","真琴"],"limit":2}'

# 3) 识图:造几张合成头像,指着它跑
python scripts/make_demo_avatars.py --out demo_avatars
ANINEST_PCR_AVATARS=./demo_avatars python scripts/mcp_smoke.py --call portrait_identify \
  --args '{"images":["demo_avatars/100101.png"]}'

测试

pip install -e ".[dev]"
ruff check src tests eval scripts demo     # 风格与静态检查
python -m unittest discover -s tests       # 单元 + 契约测试
python eval/run_eval.py                    # 离线评测(tag 编译,26 条 golden case)
python eval/run_eval.py --network          # 联网端到端(成功率 / p50 / p95)
python scripts/live_check.py               # 对着正在跑的本地服务逐个调工具

当前结果(Windows 11 / Python 3.13 / 本机直连,2026-10-29):

指标

结果

单元 + 契约测试

172 passed

离线评测(26 条 golden case)

26/26,tag recall 1.000,precision 1.000,字段准确率 1.000

联网端到端(18 条真实请求)

18/18 成功,p50 1.67 s,p95 1.99 s

CI 矩阵

3.10 / 3.12 / 3.13 × Ubuntu / Windows + Docker 镜像构建,7 job 全绿

每一层能证明什么、不能证明什么,见 测试说明。

架构

flowchart LR
    H["MCP 宿主<br/>Claude Desktop / DSH / 编辑器插件"] -- "MCP(stdio / HTTP)" --> S
    S["aninest-mcp<br/>10 tools + 1 resource + 1 prompt"]
    S --> B["插画站(booru)"]
    S --> C["作业查询服务<br/>登录态留在那边"]
    S --> D["本地 SQLite 记忆库(只读)"]
    S --> E["本机服务端口探活"]
    S --> F["本地覆盖层<br/>(唯一写入点)"]

代码结构、模块职责、改哪里看什么:架构说明。 设计取舍(为什么这样分层、为什么不上向量库等):DECISIONS。

安全与隐私

  • 只读优先:十个工具里七个只读;写入只落本地覆盖层,原子写、可随时删。

  • 零凭证:arena_lookup 走本机服务,登录态存在浏览器 profile 里,不进代码、不进仓库。

  • 只放行确定安全的图:分级归一化(s/safe/g/general → safe,q/e 丢弃)。

  • 不编造:网络错误、非 JSON 响应、空结果分别报错,不返回假数据。

  • 可审计:返回里带 relaxed / attempt / score / rating 等结构化字段。

数据边界见 PRIVACY,攻击面与信任边界见 THREAT_MODEL, 与 MCP 规范的对照见 COMPLIANCE。

文档

内容

文件

安装、卸载、故障排查

docs/INSTALL.md

工具参数、返回、报错

docs/USAGE.md

代码结构与改动指引

docs/ARCHITECTURE.md

五层验证与"能证明什么"

docs/TESTING.md

数据边界与隐私

docs/PRIVACY.md

威胁模型

docs/THREAT_MODEL.md

MCP 规范符合度

docs/COMPLIANCE.md

设计取舍(ADR)

docs/DECISIONS.md

变更记录

CHANGELOG.md

常见问题

装完客户端看不到工具? 先跑 python scripts/mcp_smoke.py;能看到工具就说明 server 正常, 问题在客户端配置路径或 command 写错。

portrait_identify 报"没有头像包"? 它需要 ANINEST_PCR_AVATARS 指向一个目录, 里面是 <六位 id>.webp|png|jpg。没有素材时用 scripts/make_demo_avatars.py 造几张练手。

arena_lookup 报连不上? 它只对接本机服务;没有的话用 scripts/fake_arena.py 起替身, 或把 ANINEST_ARENA_URL 指到任何实现 POST /search 的服务。

装到 3.10 上崩了? CI 覆盖 3.10/3.12/3.13,遇到问题请附 python -V 与完整 traceback。

Roadmap

  • 按角色名 / 黑话 / uid 查阵容

  • 裁好的头像 → 角色

  • 角色表本地覆盖层(新角色、纠错别名)

  • 整页截图的一体化入口(需要宿主侧的版面适配)

  • 检索层可插拔(当前是确定性关键词,可选接入向量检索)

License

MIT。

Available Tools

10 tools
arena_lookupArena lineup lookupA
Read-only

Look up defence teams for a lineup via the local arena browser service.

Args: defense: the lineup by name — "布丁", "克总", "真琴" … (names, aliases or ids). def_ids: the same thing as six-digit ids, if you already have them. region: arena region id, 1 = mainland, 2 = overseas, 0 = no filtering. limit: how many teams to summarise, 1-6 (display cap, not a game rule). exclude: names to drop before searching ("先排除一个再查"). replace: in-place swaps such as ["宫子->真琴"]; positions are preserved.

NameRequiredDescriptionDefault
limitNo
regionNo
def_idsNo
defenseNo
excludeNo
replaceNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnly, non-destructive, open-world and non-idempotent, so the safety profile is covered. The description adds useful context ('display cap, not a game rule', 'positions are preserved' for replace), but says nothing about service availability, failure modes, or result ordering for a tool that depends on a local browser service.

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

Conciseness4/5

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

The purpose sentence is front-loaded and the Args block is compact, with each line contributing parameter meaning rather than restating the name. Sphinx-style formatting is slightly verbose but not wasteful.

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?

With an output schema present and annotations covering safety, the description need only explain intent and inputs, which it does for a tool with no required parameters. The remaining omission is how the team summaries are scoped or ranked, which matters for interpreting results.

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?

Schema description coverage is 0%, so the description must carry the burden, and it does: all six parameters get meaning, including the defense/def_ids duality, region coding (1/2/0), the 1-6 limit as a display cap, and a concrete replace syntax example with position semantics. Only minor gaps remain, such as array-length rules or what 'six-digit ids' means numerically.

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

Purpose4/5

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

The first sentence gives a specific verb and resource ('Look up defence teams for a lineup') and names the backing service ('local arena browser service'). It is clearly distinct from the character/portrait/memory siblings, though it does not explicitly say so.

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 rather than stated: the agent learns that def_ids is an alternative to defense 'if you already have them' and that region=0 disables filtering, but there is no explicit when-to-use/when-not guidance and no mention of the sibling tools as alternatives.

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

character_correctCharacter name correctionA
Idempotent

Teach the table that term refers to a character.

This is the manual fix for a wrong match: the term is stored as an alias of the chosen character and the correction is logged with a timestamp.

Args: term: what the user actually typed, e.g. "宫紫". char_id: the character it should resolve to (id or any known name). note: optional free text kept with the correction.

NameRequiredDescriptionDefault
noteNo
termYes
char_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare the mutation profile (readOnly=false, destructive=false, idempotent=true), and the description adds real value beyond them: the term is persisted as an alias and the correction is timestamped in a log. It could go further on what happens if the term is already aliased to a different character, but the persistence and logging disclosure is substantive.

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

Conciseness4/5

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

Front-loaded with the core behavior in one sentence, then the persistence detail, then a compact Args block. Slight redundancy between the opening sentence and the Args block for char_id, but nothing is wasted.

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 small mutation tool with an output schema and annotations, the description covers what changes, what is logged, and what each argument means. Remaining gaps (collision behavior when a term is already aliased) are minor and not required for correct invocation.

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

Parameters5/5

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

With 0% schema description coverage the description must carry the load, and it documents all three parameters: term is the raw user text with a concrete example, char_id accepts an id or any known name (matching the anyOf int/string union), and note is optional free text. That is meaningfully more than the bare schema titles provide.

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 and resource ('teach the table that term refers to a character') and frames itself as 'the manual fix for a wrong match', which separates it from automatic matchers like character_match and from character_update. An agent can tell what this does without opening the schema.

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 'the manual fix for a wrong match' gives clear context for when to reach for it, distinguishing it from the automatic matching path. It stops short of explicitly naming the alternative sibling (character_match) or stating when not to use it, so it misses the top band.

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

character_lookupCharacter lookupA
Read-onlyIdempotent

Map a character name, nickname, four-digit uid or six-digit id to an arena id.

Args: query: what the player said — "布丁", "克总", "猫拳", "1001", "100101". limit: how many candidates to return, 1-10.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

The annotations already establish that this is a read-only, idempotent, non-destructive, closed-world operation. The description adds useful behavior by explaining that the lookup maps identifiers to an arena id and that the limit parameter controls how many candidates are returned.

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 short and front-loaded with the core mapping behavior. The Args section is tightly scoped to the two parameters and includes examples that earn their place.

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?

An output schema exists, so the description need not explain return structure, and the annotations already cover safety traits. The remaining gap is that it does not explain how ambiguous matches are handled or when another character-related sibling should be preferred.

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?

Schema description coverage is 0%, so the description must carry parameter meaning. It does define both parameters: query accepts character names, nicknames, uids, or ids with concrete examples, and limit returns between 1 and 10 candidates.

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

Purpose4/5

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

The description states a specific verb and resource: mapping a character name, nickname, uid, or id to an arena id. It is clear what the tool does, but it does not explicitly distinguish itself from related siblings such as character_match or character_correct.

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?

The examples of accepted query values imply when the tool is useful, but there is no explicit guidance on when to use it versus character_match, character_correct, or arena_lookup. Usage is inferable but not directly stated.

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

character_matchCharacter name matchA
Read-onlyIdempotent

Rank characters by how close their names are to a query.

Use this when a lookup fails because the name is not in the table: the score and matched_on say whether the candidate is trustworthy, so the host can ask the user instead of guessing.

Args: query: a name in any form, e.g. "宫紫", "ミヤコ", "miyako". top_k: how many candidates to return, 1-20. threshold: minimum score, 0-1; below it nothing is returned.

NameRequiredDescriptionDefault
queryYes
top_kNo
thresholdNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, closed-world and non-destructive, so safety is covered. The description adds genuine behavior beyond that: it discloses that `matched_on` and `score` carry trust signal, that results are ranked, and that a threshold can yield an empty result set — enough for the agent to handle the no-match case. It does not discuss scoring methodology, tie-breaking, or how many candidates typically clear the default threshold, which a ranking tool would ideally address.

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

Conciseness4/5

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

The three-sentence preamble front-loads purpose then the failure condition then the decision guidance, and the Args block is scannable. Every sentence earns its place; only the trailing newline-separated docstring formatting is slightly verbose, but nothing is wasted.

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?

An output schema exists, so return shape needn't be documented, and the description still usefully previews `score` and `matched_on` as interpretation aids. For a 3-parameter read-only ranking tool the coverage is nearly complete; only scoring semantics and defaults are absent.

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?

Schema coverage is 0%, so the description must carry the load, and it largely does: it explains `query` accepts a name in any script with CJK, kana and romaji examples, gives `top_k` a 1-20 range that the schema omits, and defines `threshold` as a 0-1 minimum whose effect is that nothing below it is returned. It does not state the defaults (5 / 0.45) or how the score is scaled, leaving a small gap.

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

Purpose4/5

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

The first sentence states a specific verb and resource: rank characters by name similarity to a query. It is clearly distinguishable from an exact lookup, and the second sentence reinforces the fuzzy-matching nature by framing it as the fallback when a name is not in the table. It never names `character_lookup` explicitly, so sibling routing relies on inference.

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?

It gives a concrete triggering condition — a lookup failed because the name is absent — and a downstream action policy: use `score` and `matched_on` to decide whether to ask the user rather than guess. There is no explicit exclusion (e.g. 'do not use when you have an exact ID'), which keeps it a step below a 5.

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

character_updateCharacter updateA
Idempotent

Add a character or extend its aliases in the local overlay file.

New characters are usually published in Japan first and arrive with a Japanese name before any Chinese alias exists; pass jp so lookups by the Japanese name work immediately. The packaged table is never modified.

Args: char_id: six-digit arena id, e.g. 100701. name: Chinese name; required when creating a character that is not known. aliases: extra names to accept, e.g. ["布丁新皮", "miyako"]. jp: Japanese name, e.g. "ミヤコ". servers: servers the character exists on, e.g. ["jp", "cn"]. remove_aliases: aliases to drop (a wrong alias is worse than a missing one).

NameRequiredDescriptionDefault
jpNo
nameNo
aliasesNo
char_idYes
serversNo
remove_aliasesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower, and the description still adds real value: it names the write target (local overlay file), guarantees the packaged table is untouched, and gives the cautionary rationale that a wrong alias is worse than a missing one. It omits what happens on an unknown char_id with no name, or whether an overlay file is created if absent.

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

Conciseness4/5

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

The purpose is front-loaded in the first line, followed by motivation and then an Args block, so the agent reads the important content first. The Args block is somewhat verbose relative to an already-titled schema, but each entry adds examples the schema lacks, so little is wasted.

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?

An output schema exists, so return values need no explanation, and annotations cover read-only/idempotency. For a six-parameter mutation with a local overlay side effect, the description explains the write target and non-destructiveness of the packaged data; the remaining gap is failure behavior (unknown char_id, missing name) and valid server values.

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?

Schema description coverage is 0%, so the description carries the full burden, and it documents all six parameters with meaning plus examples (six-digit arena id, Chinese name, alias list, Japanese name, servers, removal list). The gap is `servers`: 'servers the character exists on' gives no valid set of values or enum hint, and it doesn't say whether `name` overwrites an existing entry.

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

Purpose4/5

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

The first sentence states a specific verb and resource: add a character or extend its aliases in the local overlay file, and explicitly notes that the packaged table is never modified. It contrasts with the read-side siblings (character_lookup, character_match) implicitly through 'overlay file' mutation, but never names character_correct, which is the nearest ambiguous sibling.

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 context is implied by the Japan-first publishing note, which explains why an agent would pass `jp` immediately. However, there is no explicit when-to-use/when-not guidance and no routing to siblings such as character_lookup (read) or character_correct (fix an existing entry), leaving the agent to infer which of the two mutation-ish tools to call.

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

memory_statsMemory store statsA
Read-onlyIdempotent

Report row counts and database size of the local memory store.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered elsewhere. The description adds only that the store is 'local' and that output is a count plus a size — useful framing but nothing beyond structured data. No mention of cost, latency, or whether counts span all tables.

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 sentence with no filler, front-loading both the action and the specific metrics returned. Nothing could be trimmed without losing 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?

With an output schema present and no parameters, the description needn't explain return values or argument formats, and the annotations cover safety. It is essentially complete; only scope (which tables/counters are tallied) is left unstated.

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 tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline 4 applies; noting that the reported metrics are counts and size is a small bonus.

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?

Specific verb 'Report' with a concrete object: row counts and database size of the local memory store. This is clearly distinguishable from memory_search (querying content) and service_health (service status) without opening any schema.

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 only implied: an agent can infer this is the diagnostic/size-check tool, but the description never states when to reach for it instead of memory_search or service_health, nor any preconditions. Adequate for an obvious zero-arg stats call, but no explicit routing guidance.

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

portrait_identifyPortrait identificationA
Read-onlyIdempotent

Identify which characters are in cropped portrait images.

Args: images: one entry per portrait — a file path, raw bytes as base64, or a data URI. top_k: candidates per portrait, 1-10. min_score: similarity floor below which the portrait counts as unknown, 0-1.

NameRequiredDescriptionDefault
top_kNo
imagesYes
min_scoreNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds real value beyond that by defining what min_score means behaviorally — 'similarity floor below which the portrait counts as unknown' — telling the agent how low-confidence results are reported, and by enumerating accepted input encodings.

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?

One front-loaded sentence states the purpose, then a compact Args block gives exactly the per-parameter detail the schema lacks. No repetition of schema types, no filler, nothing an agent must scan past.

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 three-parameter read-only tool with an output schema (so return values need no explanation), the description covers inputs and the unknown-result rule adequately. It stops short of explaining how multiple images are batched in the response or the ordering/size of the candidate list, which would fully close the loop.

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

Parameters5/5

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

Schema coverage is 0%, so the description must carry the burden and it does: images accepts a file path, base64 raw bytes, or a data URI; top_k is candidates per portrait bounded 1-10; min_score is a 0-1 similarity floor. Every parameter gains syntax or range meaning beyond the bare schema types.

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

Purpose4/5

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

States a specific verb and resource — identifying which characters appear in cropped portrait images — which is concrete enough to act on. It does not distinguish itself from the sibling tools character_match or character_lookup, which an agent might plausibly confuse with identification, so it falls short of a 5.

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?

The phrase 'cropped portrait images' implicitly scopes the input (cropped portraits, not full art or free-form images), which is useful implied usage guidance. However there is no explicit when-to-use versus character_match/character_lookup, no prerequisites, and no stated exclusions.

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

service_healthService healthA
Read-onlyIdempotent

Probe the local services of the assistant stack and report their status.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds that it actively 'probes' services (a live check, not a cached read), which is real context beyond the annotations, but it says nothing about latency, timeouts, or what a failed probe looks like.

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?

One sentence, front-loaded with the action and the scope, with no filler or redundant restatement of the title. Nothing could be trimmed without losing meaning.

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?

An output schema exists, so return values need not be described, and annotations cover the safety profile for a zero-parameter tool. What remains thin is which services constitute 'the stack' and whether probing has any cost, but for a simple diagnostic call the description is sufficient to invoke it correctly.

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 tool takes zero parameters, so there is nothing for the description to disambiguate. Baseline of 4 applies for a parameterless tool.

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

Purpose4/5

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

States a specific verb (probe) plus a specific resource (local services of the assistant stack) and the outcome (report their status). Sibling tools cover entirely different domains (art_search, memory_search, character_lookup), so no differentiation text is needed. The only softness is that 'the assistant stack' is not enumerated.

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 only implied: an agent infers this is a diagnostics/status check to run when the stack may be unhealthy. There is no explicit 'use when', no exclusions, and no statement about when a different tool would be the right call.

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. 6 tool updatesv0.4.2
    • Changedarena_lookup8 fields changed
      • addedInput schema / properties / def_ids / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "type": "integer"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / def_ids / default
        Added value: +null
      • removedInput schema / properties / def_ids / items
        Removed value: -{
        -  "type": "integer"
        -}
      • removedInput schema / properties / def_ids / type
        Removed value: -"array"
      • addedInput schema / properties / defense
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Defense"
        +}
      • addedInput schema / properties / exclude
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Exclude"
        +}
      • addedInput schema / properties / replace
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Replace"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "def_ids"
        -]
    • Addedcharacter_correct
    • Addedcharacter_lookup
    • Addedcharacter_match
    • Addedcharacter_update
    • Addedportrait_identify
  2. 5 tool updatesv0.1.0
    • First observedarena_lookup
    • First observedart_search
    • First observedmemory_search
    • First observedmemory_stats
    • First observedservice_health

TDQS

A4/5.0

Scored across 10 tools

Disambiguation4/5

Most tools target clearly distinct resources: image identification, art search, arena defence lookup, memory search/stats, and service health. Two pairs blur at the edges — character_lookup vs character_match (exact-ish resolution vs fuzzy fallback ranking) and character_update vs character_correct (both can install a new alias) — but the descriptions explicitly frame one as the fallback/manual fix for the other, so an agent can choose correctly.

Naming Consistency5/5

Every tool follows the same snake_case noun_verb pattern (portrait_identify, art_search, character_lookup, arena_lookup, memory_search, character_update...). The shared character_/memory_ prefixes also make the groupings immediately legible.

Tool Count5/5

Ten tools is well within the sweet spot and each one maps to a concrete operation in the assistant stack. No filler tools and no obviously missing sibling that would force a merge.

Completeness4/5

Character resolution has a full lifecycle (lookup, fuzzy match, create/extend, manual correction with alias removal), and identification, art search, arena, memory and health probes cover the surrounding workflows. Minor gaps remain: no way to delete a character entirely or list/browse the table, and the memory surface is explicitly read-only with no write path inside this server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    MCP server for Discord bot API that exposes five tools to search, inspect, and call stable Discord HTTP endpoints using bot-token authentication, with automatic schema refresh and strict safety filtering.
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to query a running KanColle game client's live state and integrated resources—fleets, quests, battle history, and id lookups—through read-only tools.
    10 npm
    MIT