Skip to main content
Glama
Grimkey

raw-mcp

by Grimkey

raw_mcp

A minimal Model Context Protocol server written in pure Python — no MCP SDK, no third-party libraries. It speaks JSON-RPC 2.0 over stdio, which is how MCP clients talk to servers they launch as a subprocess.

Prerequisites

  • uv (brew install uv)

Related MCP server: Counting MCP Server

Layout

  • server.py — the MCP server (stdlib only)

  • test_server.py — a smoke test that drives the server through a full handshake

  • pyproject.toml — uv project metadata (no runtime dependencies)

Run the tests

uv run test_server.py

Run the server manually

The server reads JSON-RPC from stdin and writes responses to stdout, so you can poke at it by hand:

uv run server.py

Then paste a line and press enter:

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{}}}

Diagnostic logs go to stderr so they never corrupt the JSON on stdout.

Use it from an MCP client

Point any MCP client (Claude Desktop, etc.) at the server via uv. Example claude_desktop_config.json:

{
  "mcpServers": {
    "raw-mcp": {
      "command": "uv",
      "args": ["run", "server.py"],
      "cwd": "/Users/jameswhite/conductor/workspaces/raw_mcp/san-salvador"
    }
  }
}

Use it from Claude Code

Register the server with Claude Code's MCP support, then call the tool from a session.

Add the server

claude mcp add raw-mcp -- uv run --directory /Users/jameswhite/conductor/workspaces/raw_mcp/san-salvador server.py
  • raw-mcp is the name it shows up as.

  • Everything after -- is the launch command. Using uv run --directory <path> means it works regardless of which directory you start Claude Code from. If you always launch from this folder, claude mcp add raw-mcp -- uv run server.py is enough.

  • Default scope is local (just you, this project). Add -s user to make it available everywhere, or -s project to share it via a committed .mcp.json.

Verify it connected

claude mcp list          # shows configured servers + connection status
claude mcp get raw-mcp   # shows the launch command for this one

raw-mcp should report ✔ Connected.

Use it

MCP servers are loaded at session startup, so open a fresh interactive Claude Code session (or restart your current one), then:

  • Run /mcp — you should see raw-mcp connected with one tool, calculate_length.

  • Ask Claude to use it, e.g. "Use the raw-mcp calculate_length tool on the string 'hello world'." The tool is exposed as mcp__raw-mcp__calculate_length.

Remove it when done

claude mcp remove raw-mcp

The one tool

calculate_length — returns the character count of a string.

How it works

  1. initialize — the handshake. The server advertises protocolVersion and its tools capability.

  2. notifications/initialized — the client acknowledges. It's a notification (no id), so the server sends nothing back.

  3. tools/list — the server returns its tool definitions and JSON schemas.

  4. tools/call — the client invokes a tool; the server returns content blocks.

Adding a tool is two steps: append its definition to TOOLS, then handle its name in call_tool.

Available Tools

1 tool
calculate_lengthA

Returns the character count of a string

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

TDQS

A3.8/5.0
Behavior3/5

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

There are no annotations, so the description carries the behavioral burden. It clearly states the returned result, but it does not disclose edge-case behavior such as Unicode code point handling, empty strings, or whether whitespace is counted. For a simple pure function this is acceptable but not thorough.

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 focused sentence with no filler or redundant detail. It delivers the core behavior immediately.

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 tool with one simple parameter, no annotations, and no output schema, the description provides the essential return behavior. It could mention return type or edge cases, but nothing critical is missing for correct invocation.

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 0%, so the description should compensate for parameter meaning. It refers to 'a string', which maps to the single 'text' parameter, but it does not explicitly name the parameter or add constraints. The parameter name and type are self-explanatory enough to make this minimally viable.

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 ('returns') and resource ('character count of a string'), making the tool's function immediately clear. It also adds precision by specifying character count rather than byte length or other length metrics.

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?

No explicit usage guidance or alternatives are provided, but the purpose is simple enough that when to use the tool is implied: whenever a character count of a string is needed. There are no siblings to differentiate from.

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. 1 tool updatev0.1.0
    • First observedcalculate_length

TDQS

A3.6/5.0

Scored across 1 tool

Disambiguation5/5

Only one tool exists, so there is no possibility of confusing it with another tool. The tool's purpose is clearly defined and isolated.

Naming Consistency5/5

The single tool name follows a clear verb_noun pattern (calculate_length), which is internally consistent and self-explanatory.

Tool Count1/5

A single trivial tool for character counting is extremely thin for a server and feels like a placeholder rather than a coherent toolset.

Completeness1/5

The server provides only string length calculation, leaving substantial gaps for any raw string manipulation tasks. The domain is severely underrepresented, offering a dead-end surface.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    MCP server that counts the number of Chinese characters (excluding punctuation, spaces, English, and numbers) in a given text, compatible with Streamable HTTP and JSON-RPC.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Zero-dependency stdio bridge to Moltline Studio's fleet of 14 hosted MCP servers covering code review, time operations, data transforms, business ops, education, research, outreach and more. Free tier requires no registration; premium tools unlock with a license. Independently audited, MCPize Verified A.
    10
    MIT