Skip to main content
Glama

NaN MCP Server

npm Descargas Node CI License MCP

Servidor MCP (Model Context Protocol) que expone las herramientas de media de la API de NaN (api.nan.builders) para cualquier cliente compatible con MCP.

Al ser un estándar abierto, funciona con opencode, Claude Code, Codex, Pi, Cursor, Windsurf, Zed, etc.

Herramientas

Herramienta

Descripción

Modelo

generate_image

Generar imagen desde texto

flux-2-klein

edit_image

Editar imagen (imagen→imagen)

flux-2-klein

text_to_speech

Sintetizar audio desde texto

kokoro

list_voices

Listar voces kokoro por idioma

speech_to_text

Transcribir audio a texto

whisper

embed_text

Embeddings vectoriales (4096 dims)

qwen3-embedding

rerank_documents

Reordenar documentos por relevancia (RAG)

rerank

list_models

Listar modelos disponibles con tu key

Related MCP server: mmxomni

Requisitos

  • Node.js >= 18

  • Una API key de NaN (sk-...)

Instalación

El paquete se distribuye por npm. La forma más simple de usarlo en cualquier cliente MCP es sin instalarlo: npx lo ejecuta al vuelo.

export NAN_API_KEY="sk-tu-key-aqui"
npx -y nan-mcp-server@1.1.2

Con otro gestor de paquetes, si ya lo usas:

pnpm dlx nan-mcp-server@1.1.2    # pnpm
yarn dlx nan-mcp-server@1.1.2    # yarn
bunx nan-mcp-server@1.1.2        # bun

O instálalo globalmente:

npm install -g nan-mcp-server@1.1.2   # o: pnpm add -g / bun add -g
nan-mcp-server

Sobre la versión fijada: los ejemplos fijan una versión exacta en lugar de @latest, a propósito. Con @latest, cada arranque descarga la última versión publicada, así que cualquier versión futura —incluida una publicada por una cuenta comprometida— se ejecutaría en tu máquina automáticamente. Fijar la versión te deja decidir cuándo actualizar; consulta las releases y sube el número cuando quieras. Si prefieres actualizaciones automáticas, sustituye la versión por @latest en cualquiera de los ejemplos.

Configuración

El servidor se ejecuta vía stdio (proceso local). Solo necesita una variable de entorno: NAN_API_KEY.

Las imágenes y audios generados se guardan en ~/nan-mcp-output/ (configurable con NAN_OUTPUT_DIR).

Configuración por cliente

Añade a tu opencode.jsonc (o créalo en ~/.config/opencode/):

{
  "mcp": {
    "nan-media": {
      "type": "local",
      "command": ["npx", "-y", "nan-mcp-server@1.1.2"],
      "environment": {
        "NAN_API_KEY": "{env:NAN_API_KEY}"
      }
    }
  }
}

Instalar vía CLI:

claude mcp add nan-media --scope user -e NAN_API_KEY='${NAN_API_KEY}' -- \
  npx -y nan-mcp-server@1.1.2

O en .mcp.json:

{
  "mcpServers": {
    "nan-media": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "nan-mcp-server@1.1.2"],
      "env": {
        "NAN_API_KEY": "${NAN_API_KEY}"
      }
    }
  }
}

En ~/.codex/config.toml:

[mcp_servers.nan-media]
command = "npx"
args = ["-y", "nan-mcp-server@1.1.2"]
env_vars = ["NAN_API_KEY"]

env_vars no es opcional: codex no propaga su propio entorno a los servidores MCP, así que sin esa línea el proceso arranca sin NAN_API_KEY y muere durante el handshake (connection closed: initialize response). env_vars nombra las variables que debe heredar; env solo admite valores literales, que no conviene escribir en un archivo versionado.

Pi usa pi-mcp-adapter y lee los archivos MCP estándar. Instala el adaptador:

pi install npm:pi-mcp-adapter

Crea ~/.config/mcp/mcp.json (config compartido MCP estándar):

{
  "mcpServers": {
    "nan-media": {
      "command": "npx",
      "args": ["-y", "nan-mcp-server@1.1.2"],
      "env": {
        "NAN_API_KEY": "$env:NAN_API_KEY"
      }
    }
  }
}

La key se interpola con $env:NAN_API_KEY, así que ningún secreto queda en el archivo.

Para usar los modelos de NaN en Pi, define el proveedor en ~/.pi/agent/models.json:

{
  "providers": {
    "nan": {
      "baseUrl": "https://api.nan.builders/v1",
      "api": "openai-completions",
      "apiKey": "$NAN_API_KEY",
      "models": [
        { "id": "deepseek-v4-flash", "name": "DeepSeek V4 Flash", "reasoning": true, "input": ["text", "image"], "contextWindow": 1048576 },
        { "id": "qwen3.6", "name": "Qwen 3.6", "reasoning": true, "input": ["text", "image"], "contextWindow": 262144 }
      ]
    }
  }
}

Luego usa --provider nan --model <id> (p.ej. pi --provider nan --model deepseek-v4-flash).

En la configuración de MCP del cliente, añade un servidor stdio:

Comando: npx -y nan-mcp-server@1.1.2
Variables: NAN_API_KEY=tu-clave-de-nan-builders (no la incluyas en el config versionado)

Uso

Una vez conectado, pide al agente:

  • "Genera una imagen de un faro al atardecer con nan-media"

  • "Sintetiza en español: Hola mundo, voz ef_dora"

  • "Transcribe el audio /ruta/audio.mp3"

  • "Reordena estos documentos según la query X"

Límites de la API

Recurso

Límite

Generación/edición de imágenes

100 req/mes por usuario, 1 req/s (burst 3)

Tamaño máximo archivo (STT / edit_image)

25 MB por archivo

Audios para transcripción

máx. ~2 min por archivo (timeout 524 si supera)

Imágenes de referencia (edit_image)

hasta 4

Variables de entorno

Variable

Obligatoria

Descripción

NAN_API_KEY

API key de NaN

NAN_BASE_URL

No

Base URL de la API (default https://api.nan.builders/v1)

NAN_OUTPUT_DIR

No

Directorio de salida (default ~/nan-mcp-output)

NAN_TIMEOUT_MS

No

Timeout por petición en ms (default 180000, 3 min)

Desarrollo

Estructura

nan-mcp-server/
├── server.js            # Servidor MCP + herramientas
├── test/server.test.js  # Tests (node:test, sin dependencias extra)
├── .github/workflows/   # ci.yml (tests) + publish.yml (npm)
├── package.json
└── README.md

Testing

Los tests usan el test runner nativo de Node (node:test), sin dependencias adicionales. No hacen llamadas a la API (usan un valor de prueba para NAN_API_KEY), así que se ejecutan sin red ni credenciales.

npm test

Para probar el servidor manualmente contra la API real (requiere key):

NAN_API_KEY=sk-tu-key-aqui node server.js

Y luego una llamada de ejemplo vía stdio:

printf '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}\n{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}\n' \
  | node server.js

Publicación / CI

  • El código no contiene secretos: NAN_API_KEY se lee solo del entorno.

  • El .gitignore excluye node_modules/, logs y .env.

  • .github/workflows/ci.yml ejecuta los tests en cada push y PR a main sobre Node 18, 20, 22 y 24, más un job strict-deps con pnpm: su node_modules sin hoisting hace fallar cualquier import de un paquete no declarado en package.json (npm lo dejaría pasar silenciosamente).

  • .github/workflows/publish.yml publica en npm al crear un release en GitHub, vía trusted publishing (OIDC), sin token en secrets.

Notas

  • Las imágenes y audios se guardan en ~/nan-mcp-output/ (configurable con NAN_OUTPUT_DIR). Los nombres se sanitizan (sin path traversal) y nunca se sobrescriben archivos existentes: si el nombre ya está ocupado se añade -2, -3, etc.

  • Los archivos de entrada (STT / edit_image) se cargan en memoria; para archivos muy grandes conviene dividirlos.

  • El servidor no contiene ningún secreto en el código: solo lee NAN_API_KEY del entorno.

Licencia

MIT — ver LICENSE.

Available Tools

8 tools
edit_imageEdit ImageA

Transform existing images with flux-2-klein image-to-image (NaN API). Use generate_image instead when starting from text alone. Takes 1 to 4 local reference files (PNG, JPEG or WebP, each under 25MB), saves the result under NAN_OUTPUT_DIR (default ~/nan-mcp-output) without overwriting anything, and returns the saved path and the temporary source URL. Counts against the account image quota (100/month).

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoNumber of images to generate (1-4). Default 1
seedNoBase seed for reproducibility
sizeNoImage size "WxH" divisible by 16, e.g. 1024x1024, 1536x1024, 1024x1536. Default 1024x1024
imagesYesAbsolute paths to reference image files (PNG, JPEG, WebP; up to 4, each < 25MB)
promptYesDescription of the edit or transformation to apply
guidanceNoFLUX guidance scale
outputNameNoOptional base name for the output file(s)

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations, the description carries the full transparency burden and does so thoroughly: it discloses local input file constraints, output directory and non-overwrite guarantee, return values (saved path and temporary source URL), and the quota side effect (100/month). These are exactly the behavioral details an agent needs beyond the schema.

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 description is well structured, front-loading the purpose and the critical ordering guidance, and each sentence adds value. However, it repeats some schema details (e.g. PNG/JPEG/WebP, 25MB) that are already present in the images parameter description, causing mild redundancy.

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 tool with no output schema, the description provides the needed operating context: it documents what inputs are accepted, what the tool does to them, where results are stored, that outputs are not overwritten, and the return value. this is sufficient for an agent to invoke the tool correctly without guessing.

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%, so the baseline is 3. The description does add a little semantic context (e.g. reference file formats and the result, output name) but largely duplicates schema information like file types and size limits. It does not provide deeper meaning beyond the schema, so a 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 starts with a specific verb-resource pair ('Transform existing images with flux-2-klein image-to-image') and immediately distinguishes from the sibling tool by telling the reader to 'Use generate_image instead when starting from text alone.' The agent can tell exactly what this tool does and how it differs from its closest sibling.

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

Usage Guidelines5/5

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

Provides explicit usage guidance by naming the alternative tool and giving the exact condition for choosing it: 'Use generate_image instead when starting from text alone.' This clearly tells the agent when not to use this tool. The description also indirectly grounds when to use it (when existing images are available to transform).

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

embed_textEmbed TextA

Turn text into 4096-dimension vectors with qwen3-embedding (NaN API) for RAG or semantic search; rerank_documents then orders whatever a search over those vectors brings back. Returns only a summary — item count, dimensions and input tokens — because the vectors are far too large to put in the conversation, so use this to populate a store rather than to read values.

ParametersJSON Schema
NameRequiredDescriptionDefault
inputYesSingle text or array of strings to embed. Passing the whole batch in one call is cheaper than one call per string
encoding_formatNoEncoding format. Default float

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden and succeeds admirably. It discloses the non-obvious behavior that the tool returns only a summary (item count, dimensions, input tokens), not the vectors themselves, and explains why (vectors too large for conversation). It also cautions the agent to use this for populating a store rather than reading values, which prevents a classic misuse.

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?

Two dense sentences that each earn their place: the first establishes purpose and sibling relationship, the second explains the surprising return behavior and gives a usage directive. The key purpose is front-loaded, and there is no filler.

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 two-parameter tool with no output schema and no annotations, the description covers everything an agent needs to call it correctly: purpose, model, dimension, return shape (summary fields), batch guidance, and the follow-up sibling. The lack of an output schema is compensated by explicitly enumerating the returned summary fields.

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 100%, so the schema documents both parameters. The description adds genuine value beyond the schema by explaining that batching strings in one call is cheaper, which informs how the 'input' parameter should be used. Encoding_format is already fully covered by the enum and default, and the description adds nothing needed there.

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 states a specific verb ('Turn text into...vectors'), names the exact model (qwen3-embedding), gives the output dimension (4096), and declares the use case (RAG or semantic search). It also differentiates itself from sibling rerank_documents by positioning it as the subsequent ordering step, so there is no ambiguity about what this tool does.

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 provides clear context for when to use the tool: for RAG or semantic search, and to populate a vector store rather than read values. It also explains the relationship to the rerank_documents sibling ('then orders whatever a search over those vectors brings back'). It does not explicitly state when not to use it or name an alternative for the same job, so it stops short of a 5.

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

generate_imageGenerate ImageA

Generate an image from a text prompt with flux-2-klein (NaN API). Use edit_image instead when you already have reference images to transform. Saves each image under NAN_OUTPUT_DIR (default ~/nan-mcp-output) and never overwrites: a taken name gets -2, -3, and so on. Returns the saved path and the temporary source URL. Counts against the account image quota (100/month).

ParametersJSON Schema
NameRequiredDescriptionDefault
nNoNumber of images to generate (1-4). Default 1. Each one counts against the monthly quota
seedNoBase seed for reproducibility
sizeNoImage size "WxH" divisible by 16, e.g. 1024x1024, 1536x1024, 1024x1536. Default 1024x1024
promptYesTextual description of the image to generate
guidanceNoFLUX guidance scale
outputNameNoOptional base name for the output file(s). Sanitised to a safe filename; an existing name is never overwritten

TDQS

A4.5/5.0
Behavior4/5

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

Since no annotations are provided, the description carries the full burden of behavioral disclosure. It explains output directory (NAN_OUTPUT_DIR), the never-overwrite naming behavior (appending -2, -3), the return value (saved path and temporary URL), and quota implications (100/month). It does not mention rate limits or auth, but the disclosed behaviors are substantial and go beyond simple statements.

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 sentences long, highly efficient, and front-loaded. The first sentence states the core function, the second provides routing guidance and key operational details (output path, overwrite behavior, return value, quota). Every clause earns its place with no redundancy.

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?

Given the tool's moderate complexity (six parameters, but all well-documented in the schema) and the absence of an output schema, the description provides complete context: what it does, when to use it, where outputs are saved, how naming conflicts are handled, what is returned, and quota impact. Nothing an agent needs to invoke it correctly is missing.

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 has 100% description coverage for all six parameters, so the baseline is 3. The description does not add significant new meaning beyond the schema; it merely repeats that each generated image counts against the quota (already stated in the n parameter) and that output names are sanitized (already in outputName). This is adequate but not additive.

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 clearly states the primary function: generating an image from a text prompt using a specific model (flux-2-klein). It uses a specific verb ('generate'), a specific resource ('image'), and names the input (text prompt). It also distinguishes itself from the sibling tool edit_image by explicitly stating when edit_image should be used instead, which differentiates the purpose.

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

Usage Guidelines5/5

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

The description explicitly states when to use this tool versus the alternative: 'Use edit_image instead when you already have reference images to transform.' This provides clear routing guidance and leaves no ambiguity about which tool to select for different scenarios.

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

list_modelsList ModelsA

List the NaN API model ids the configured key can reach, one per line with its owner. Useful to confirm access or spot a retired model before calling another tool.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the output format (one per line with owner), the scoped result set (models the configured key can reach), and the implied read-only nature of listing.

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?

Two short, purposeful sentences. The action and output format are front-loaded, and the use case is stated without any filler.

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 parameterless list tool with no output schema, the description covers access scope, return format, and purpose. Nothing needed to invoke the tool correctly is missing.

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?

There are zero parameters, so the schema is trivially complete and the baseline is 4. The description adds no parameter information because none is needed.

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 specific action: list the model IDs the configured key can reach, one per line with its owner. This clearly distinguishes it from sibling tools like list_voices by focusing on model availability.

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?

Provides clear context for when to use the tool: to confirm access or spot a retired model before calling another tool. It doesn't name explicit alternatives, but the sibling tools cover different domains, so the intended usage is unambiguous.

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

list_voicesList VoicesA

List the kokoro voice ids that text_to_speech accepts, grouped by language. Answered from the catalog bundled with the server, so it costs no API call and takes no arguments.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It explicitly notes that the answer comes from a bundled catalog, incurs no API cost, and requires no arguments—this is beyond the basic purpose. It does not elaborate on return format beyond grouping, but for a simple list operation this is sufficient.

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, well-structured sentence that front-loads the purpose, then adds the behavioral/cost detail. Every clause earns its place; there is no filler or redundancy.

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 zero-parameter, read-only-like tool, the description covers all essential aspects: what the tool lists, how results are grouped, where data comes from, and that it is free of arguments and API cost. Without an output schema, the description still gives the agent enough to make a correct call.

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?

There are zero parameters, so the schema covers everything. The description adds clarity by explicitly stating 'takes no arguments,' which prevents any guesswork about optional fields. This meets the baseline for 0-parameter tools and adds a small user-oriented confirmation.

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 states a specific verb ('List'), the precise resource ('kokoro voice ids that text_to_speech accepts'), and the grouping ('by language'). It clearly distinguishes itself from sibling tools like list_models or text_to_speech by scoping the subject to voice IDs used by text_to_speech, so an agent knows exactly what it returns.

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 gives clear usage context: it costs no API call and takes no arguments, which tells an agent when it is safe/cheap to call. However, it does not explicitly name alternatives (e.g., list_models) or state when not to use it, though the context strongly implies it is for discovering voice IDs for text_to_speech.

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

rerank_documentsRerank DocumentsA

Order documents by how well they answer a query, with Qwen3-Reranker-8B (NaN API). This is the second half of a RAG pipeline: embed_text builds the vectors a search runs over, and this one ranks what that search returns. Returns one line per document with its relevance score and its position in the input list, in the order the reranker gives them back.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesQuery against which each document's relevance is measured
top_nNoLimit response to the N most relevant documents
documentsYesCandidate texts to re-rank, typically the top hits of a vector search

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the burden of disclosing behavior. It mentions the underlying model (Qwen3-Reranker-8B) and the output format (one line per document with relevance score and position), which adds value beyond the schema. However, it does not disclose potential rate limits, error handling, or whether the input order is preserved in case of ties. The description provides average behavioral detail for a tool with no annotations.

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 description is reasonably concise and front-loaded with the main purpose. It introduces the RAG pipeline context and the output format in a few sentences. There is minimal redundancy; each sentence earns its place. The description could be slightly trimmed, but it remains well-structured and informative.

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?

Given the tool's moderate complexity (3 parameters, no output schema) and the rich schema coverage, the description provides sufficient context for an agent to invoke it correctly. It explains the tool's role in the pipeline, the output format, and parameter semantics. The absence of an output schema is mitigated by the description's return value explanation. Minor gaps include missing error behavior or edge cases, but overall it is complete enough.

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%, so the schema already documents all three parameters: query, documents, and top_n. The description adds context about the 'documents' parameter by noting it's typically the top hits of a vector search, which is helpful but not extensive. Since the schema is thorough, a baseline of 3 is appropriate; the description adds marginal value beyond the schema.

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 clearly states the tool's purpose: ordering documents by relevance to a query using a specific reranker model. It identifies the resources (documents, query) and the action (rerank), and distinguishes it from sibling tools like embed_text and search-related tools. The context of being part of a RAG pipeline further clarifies its role.

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 provides clear context for when to use this tool: as the second half of a RAG pipeline, after embed_text builds vectors and search returns hits. It mentions the relationship to embed_text, but does not explicitly state when NOT to use it or name alternative reranking tools. The usage is implied strongly, yet lacks explicit alternatives or exclusions.

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

speech_to_textSpeech To TextA

Transcribe a local audio file with whisper (NaN API STT); text_to_speech does the opposite. The file must exist on this machine and stay under 25MB and about 2 minutes, or the request times out. Returns the plain transcript, or the full JSON with per-segment timings when verbose is set. Writes nothing to disk.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileYesAbsolute path to the audio file to transcribe
verboseNoReturn verbose JSON with segments instead of plain text
languageNoISO-639-1 language code, e.g. "es", "en". Auto-detected if omitted

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description fully carries the burden. It discloses the local file requirement, size/time limits and timeout risk, the return format (plain transcript vs. verbose JSON with per-segment timings), and explicitly states 'Writes nothing to disk'—a critical side-effect disclosure.

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?

Three concise sentences front-load the core purpose and key constraints. The statement about text_to_speech is placed early and each remaining sentence covers a distinct necessity without redundancy.

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 tool with only three parameters, no output schema, and no annotations, the description covers all essential calling information: file existence and size/time limits, output behavior, and side effects. Nothing critical is missing.

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% coverage with clear descriptions for each parameter (file path, verbose, language). The description adds slight extra context (verbose returns per-segment timings) but doesn't meaningfully enhance parameter understanding beyond the schema.

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 ('Transcribe') with a clear resource ('a local audio file') and explicitly contrasts with the sibling tool ('text_to_speech does the opposite'). This makes the tool's distinct role unmistakable.

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

Usage Guidelines5/5

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

It provides explicit conditions for use: the file must exist on this machine, be under 25MB and ~2 minutes, or the request times out. It also names the alternative (text_to_speech) for the opposite operation, giving clear when-to-use guidance.

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

text_to_speechText To SpeechA

Synthesize speech from text with kokoro (NaN API TTS); speech_to_text does the opposite. Call list_voices first to pick a voice id. Writes the audio under NAN_OUTPUT_DIR (default ~/nan-mcp-output) without overwriting anything, and returns the saved path and its size in bytes.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to synthesize
speedNoSpeech speed. Default 1.0
voiceNoVoice to use, e.g. "af_heart" (American English female), "ef_dora" (Spanish female), "em_alex" (Spanish male), "em_santa" (Spanish male). Use list_voices for the full catalog
formatNoAudio format. Default mp3
outputNameNoOptional base name for the output file

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It clearly states the tool writes audio under NAN_OUTPUT_DIR (default ~/nan-mcp-output), does not overwrite existing files, and returns the saved path and size in bytes. It does not mention auth, rate limits, or other API caveats, but the write-safe behavior is a meaningful and useful disclosure.

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?

Three sentences with no redundancy: the first states purpose and sibling distinction, the second gives a prerequisite, and the third covers output location, overwrite policy, and return value. Every sentence earns its 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?

The tool has 5 parameters (1 required), no output schema, and no annotations, so the description must carry context. It covers purpose, prerequisite, output location, overwrite behavior, and return value. Minor omissions like file extension handling and error conditions exist, but the rich schema plus this description are sufficient for a correct call.

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%, so the baseline is 3. Each parameter already has a clear description, including the voice parameter with concrete examples. The description adds no additional parameter-level detail beyond the prerequisite to call list_voices, which is usage guidance rather than parameter semantics.

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 ('Synthesize'), a clear resource ('speech from text'), and names the underlying engine ('kokoro (NaN API TTS)'). It also explicitly differentiates from the sibling 'speech_to_text' by saying it 'does the opposite', so an agent can confidently pick between the two.

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

Usage Guidelines5/5

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

The description gives concrete, actionable guidance: call list_voices first to choose a voice id, and clarifies that speech_to_text is the opposite direction. This is an explicit alternative/routing instruction rather than leaving the agent to infer when 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.

Tool Schema Changelog

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

  1. 5 tool updatesv1.1.0
    • Removedembed
    • Addedembed_text
    • Changedgenerate_image2 fields changed
      • changedInput schema / properties / n / description
        Previous value: -"Number of images to generate (1-4). Default 1"New value: +"Number of images to generate (1-4). Default 1. Each one counts against the monthly quota"
      • changedInput schema / properties / outputName / description
        Previous value: -"Optional base name for the output file(s)"New value: +"Optional base name for the output file(s). Sanitised to a safe filename; an existing name is never overwritten"
    • Removedrerank
    • Addedrerank_documents
  2. 1 tool updatev1.0.8
    • Changededit_image2 fields changed
      • addedInput schema / properties / images / maxItems
        Added value: +4
      • addedInput schema / properties / images / minItems
        Added value: +1
  3. 8 tool updatesv1.0.6
    • First observededit_image
    • First observedembed
    • First observedgenerate_image
    • First observedlist_models
    • First observedlist_voices
    • First observedrerank
    • First observedspeech_to_text
    • First observedtext_to_speech

TDQS

A4.5/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct capability: image generation, image editing, TTS, STT, embedding, reranking, and listing models/voices. The two image tools are explicitly differentiated by starting point, and the TTS/STT pair is clearly opposite. No ambiguity.

Naming Consistency5/5

All tool names use lowercase snake_case and follow a verb_noun pattern (generate_image, list_voices, embed_text, rerank_documents, edit_image) or clear compound actions (text_to_speech, speech_to_text). The style is uniform and predictable.

Tool Count5/5

With 8 tools, the server covers a broad but focused set of AI capabilities—image, audio, and text embeddings/reranking—without excess. Each tool has a clear purpose and the count is well within the ideal 3-15 range.

Completeness5/5

The tool surface covers the core lifecycle for the intended AI operations: generation and editing for images, synthesis and transcription for audio, and embedding plus reranking for RAG pipelines. No obvious missing operations for the stated domain.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers