AniNest
AniNest is an MCP server exposing ten tools for illustration search, PCR character/arena lookup, portrait recognition, local memory/service checks, and local character-overlay maintenance.
Search illustrations by Chinese/English request, with count, size, orientation, extra tags, and negative tags.
Look up characters by name, nickname, four-digit uid, or six-digit id.
Identify characters in cropped portrait images with candidate similarity scores.
Look up arena defense lineups via a local browser service, including region filtering, exclusions, and replacements.
Search and summarize the local read-only SQLite memory store.
Probe local service ports and report health.
Fuzzy-match unknown character names and return ranked candidates with scores.
Add characters or extend aliases in a local overlay file without modifying the packaged table.
Correct wrong character-name matches by storing the term as an alias with a timestamped note.
Support stdio and HTTP transports; seven tools are read-only, while character update/correct only write the local overlay.
Provides read-only search and statistics over a local SQLite memory database, enabling querying stored memories and inspecting database size and distribution without modifying the database.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@AniNestfind me a vertical swimsuit illustration of Hatsune Miku"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
AniNest · aninest-mcp
一个基于 MCP(Model Context Protocol,模型上下文协议) 的只读能力服务器,提供十个工具: 按中文描述找插画、按角色名查竞技场作业、用头像认角色、检索本地记忆、探活本机服务。
任何支持 MCP 的宿主(Claude Desktop、Cursor、自研 Agent、CI 脚本)都可以直接调用, 不需要知道背后是哪个图站、哪个本地服务、哪个游戏。
传输:
stdio(桌面客户端)与streamable-http(远端调用)协议:
2025-11-25,十个工具全部带title与annotations依赖:Python 3.10+,
mcp1.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
工具
工具 | 典型请求 | 返回 |
| "来两张初音未来泳装的竖图" | 图片链接 + 用到的 tag + 是否放宽过条件 |
| "布丁、克总、真琴、纺希、莉莎这队作业" | 别人用的防守阵容(含角色名)与票数 |
| "布丁和克总分别是哪个角色" | 角色名、六位 id、四位数 uid、别名 |
| "这几张头像分别是谁" | 每张头像的候选角色与相似度 |
| "上次说的那个配色偏好还记得吗" | 记忆条目 + 打分 + 范围(本会话/全局) |
| "记忆存了多少了" | 行数、范围分布、库大小 |
| "服务都活着吗" | 五个本地端口的连通性 |
| "宫紫 是哪个角色"(表里没有) | 按名字相似度排的候选、分数、命中方式 |
| "日服刚出的新角色,加一下" | 写本地覆盖层,返回角色与别名变更 |
| "宫紫 就是宫子,记住" | 把这个词记成别名,留一条带时间的更正记录 |
阵容可以直接说人话:角色名、黑话、四位数 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/mcpDSH(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)。
变量 | 默认值 | 说明 |
|
|
|
|
| 仅 HTTP/SSE 模式生效 |
|
| 任何 Gelbooru 风格 JSON API |
|
| 秒 |
|
| 图站要求可识别的 UA |
|
| 作业查询服务(见下文"本机依赖") |
|
| 只读打开 |
|
| 健康探测目标 |
| (空) | 头像目录 |
|
| 两个写工具落盘的位置 |
本机依赖与替身
十个工具里,只有 arena_lookup 依赖一个不在本仓库内的本机服务(持登录态的浏览器进程),
其余工具都能独立验证。没有那个服务时,用仓库自带的替身跑同一套契约:
工具 | 依赖 | 没有依赖时怎么验证 |
| 公网图站(默认 safebooru) | 直接可用;离线评测覆盖 tag 编译 |
| 无(角色表随包分发) | 直接可用 |
| 无(只写覆盖层) | 直接可用;把 |
| 头像包 + |
|
| 一个 SQLite 文件 |
|
|
|
|
| 无 | 五个端口全 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。
文档
内容 | 文件 |
安装、卸载、故障排查 | |
工具参数、返回、报错 | |
代码结构与改动指引 | |
五层验证与"能证明什么" | |
数据边界与隐私 | |
威胁模型 | |
MCP 规范符合度 | |
设计取舍(ADR) | |
变更记录 |
常见问题
装完客户端看不到工具? 先跑 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 toolsarena_lookupArena lineup lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| region | No | ||
| def_ids | No | ||
| defense | No | ||
| exclude | No | ||
| replace | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
art_searchIllustration searchARead-only
Search an illustration for a Chinese or English request.
Args: query: free-form request, e.g. "初音未来 泳装 竖图"; tags/count/orientation are parsed. count: number of images, 1-10. size: "compressed" for a smaller preview, "original" for the full-size file. orientation: optional "landscape", "portrait" or "square" filter. extra_tags: additional canonical booru tags to include. negative: tags to exclude, sent to the board as "-tag".
| Name | Required | Description | Default |
|---|---|---|---|
| size | No | compressed | |
| count | No | ||
| query | Yes | ||
| negative | No | ||
| extra_tags | No | ||
| orientation | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, non-destructive, and non-idempotent behavior. The description adds useful behavioral detail: free-form query tags/count/orientation are parsed, size controls preview versus full-size file, and negative tags are sent to the board as “-tag”.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with its purpose and then uses a compact Args structure. Every line adds parameter meaning or behavioral context without repetition or wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 explained, and annotations cover the safety profile. The description is sufficient for invocation, though it could add minor context about the source/board or empty-result behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It documents all six parameters with meaningful semantics: query examples and parsing behavior, count range 1–10, size meanings, orientation values, extra canonical booru tags, and negative exclusion syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (“Search”) and resource (“illustration”) and notes support for Chinese or English free-form requests. It does not explicitly differentiate from sibling tools, though none of the listed siblings appear to be illustration-search alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The use case is implied through the Chinese/English request example and the parameter explanations. There is no explicit guidance on when not to use this tool or which sibling to use instead, so the guidance is adequate but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
character_correctCharacter name correctionAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| term | Yes | ||
| char_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 lookupARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 matchARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| top_k | No | ||
| threshold | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 updateAIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| jp | No | ||
| name | No | ||
| aliases | No | ||
| char_id | Yes | ||
| servers | No | ||
| remove_aliases | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_searchMemory searchARead-onlyIdempotent
Search the assistant's local memory store (read-only).
Args: query: keywords or a sentence to look for. limit: maximum hits, 1-20. scope: "all", "session" or "global".
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| scope | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior. The description adds useful context about local memory, result limits, and scope modes, though it repeats the read-only trait rather than adding new safety or auth details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is compact and front-loaded, with the core purpose first and a well-structured Args block covering the three parameters. Every part contributes useful information given the empty schema descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, annotations cover safety, and an output schema exists, so return values need not be described. The description covers all parameters adequately but leaves scope-mode semantics and when-to-use guidance slightly under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates well by explaining query as keywords or a sentence, limit as maximum hits from 1-20, and scope as 'all', 'session', or 'global'. It does not explain what each scope mode means, leaving a small semantic gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search the assistant's local memory store.' It is clearly distinguishable from sibling memory_stats and other non-memory search tools, though it does not explicitly name or contrast any sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies the tool is used for searching local memory, but gives no explicit guidance on when to use it instead of alternatives such as memory_stats. There are no when-not conditions or alternative-tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_statsMemory store statsARead-onlyIdempotent
Report row counts and database size of the local memory store.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 identificationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| top_k | No | ||
| images | Yes | ||
| min_score | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 healthARead-onlyIdempotent
Probe the local services of the assistant stack and report their status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
6 tool updates
v0.4.2- Changed
arena_lookup8 fields changed- added
Input schema / properties / def_ids / anyOfAdded value: +[ + { + "items": { + "type": "integer" + }, + "type": "array" + }, + { + "type": "null" + } +] - added
Input schema / properties / def_ids / defaultAdded value: +null - removed
Input schema / properties / def_ids / itemsRemoved value: -{ - "type": "integer" -} - removed
Input schema / properties / def_ids / typeRemoved value: -"array" - added
Input schema / properties / defenseAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Defense" +} - added
Input schema / properties / excludeAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Exclude" +} - added
Input schema / properties / replaceAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Replace" +} - removed
Input schema / requiredRemoved value: -[ - "def_ids" -]
- Added
character_correct - Added
character_lookup - Added
character_match - Added
character_update - Added
portrait_identify
5 tool updates
v0.1.0- First observed
arena_lookup - First observed
art_search - First observed
memory_search - First observed
memory_stats - First observed
service_health
TDQS
Scored across 10 tools
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.
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.
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.
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
Related MCP Connectors
Remote MCP utilities for agents: structured data, commerce checks, and x402 paid API discovery.
Search, vet & assemble MCP servers from your agent: verified tools, risk labels, and trust scores.
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
Scan MCP tool definitions for poisoning, look up server history, count tool-list tokens. Free.
Related MCP Servers
- AlicenseBqualityCmaintenanceExposes ACR's memory, skill, web, and GitHub search tools to any MCP client, enabling task execution and tool access via the MCP protocol.64MIT
- AlicenseAqualityCmaintenanceMCP 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.5MIT
- AlicenseNot gradedqualityCmaintenanceEnables remote MCP access to tools for URL-to-markdown conversion, web and image search, academic search, embeddings, reranking, classification, deduplication, and PDF extraction.Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables 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 npmMIT