scout

MCP server
diagnostic report

http://127.0.0.1:39017/mcp

Verdict
Not ready for agents
Score
80 / 100 · Good
Subject
acme-crm 2.4.0
Protocol
2025-11-25
Run
Fri, 18 Sep 2026 18:04:19 UTC
Produced by
scout dev
Trace
d80b2165a37a669a2bde7b08824bf67c

Produced locally. No endpoint, credential or response in this report left the machine that ran it.

scout MCP server diagnostic report
Subject http://127.0.0.1:39017/mcp acme-crm 2.4.0 · protocol 2025-11-25 · open, no sign-in · Fri, 18 Sep 2026 18:04:19 UTC

Not ready for agents

80 / 100 Good

An agent will hit 4 problems here, and there are 3 smaller things worth fixing before you roll this server out to your fleet.

4 failed3 to improve27 passed10 noted1 skipped
Act on these

What to fix first

  1. 1 Unknown tool is reported calling a non-existent tool returned success — return -32602 or an isError result

    Calling a tool that does not exist returned success. A client has no way to tell a typo from a working call, and a model that hallucinates a tool name is told it was right.

    How to fix it

    1. Return -32601 for an unknown method or tool`Method not found`. A model that receives an error learns the tool does not exist; one that receives success learns the opposite.

    What this check asserts

  2. 2 Malformed JSON is rejected HTTP 200 for a truncated body — return 400 or -32700

    A truncated or malformed request body was answered with a success status. A client cannot distinguish that from a real answer, and a proxy or a retry that corrupts a body will look like it worked.

    How to fix it

    1. Reject a body that does not parseReturn HTTP 400, or the JSON-RPC `Parse error` code -32700. Either tells the caller what happened; 200 does not.
    2. Check the framing before the handlerThis usually belongs in the transport layer rather than in any single tool, which is why it is easy to miss.

    What this check asserts

  3. 3 tools/call without a name is rejected a tools/call with no name succeeded — validate params and return -32602

    A request missing a required parameter was answered as though it were valid. The parameter list is part of the contract; not enforcing it means the contract is advisory.

    How to fix it

    1. Return -32602 for bad params`Invalid params` is the specified answer. Include which parameter and why in the error message — that message reaches the model.

    What this check asserts

  4. 4 Tools reject missing required arguments 3 tool(s) accepted a call with a required argument omitted — validate arguments against inputSchema before executing

    The tool accepted a call with a required argument missing. The schema said the argument was required and the server did not enforce it, which means the schema is describing an intention rather than a contract. A model that gets a plausible answer to an incomplete call has no way to learn it made a mistake.

    How to fix it

    1. Validate arguments against your own schemaBefore the tool body runs, check the arguments against the `inputSchema` you published. Most SDKs will do this for you if you let them.
    2. Fail with -32602Return the JSON-RPC `Invalid params` error rather than a success with a guess in it. An error the model can read is a correction; a plausible wrong answer is not.

    What this check asserts

  5. 5 Protocol generation speaks a handshake revision: it uses initialize and Mcp-Session-Id, which 2026-07-28 removed — the current revision is 2026-07-28: requests carry their own protocol version, client identity and capabilities in _meta, sessions are gone, and Mcp-Method/Mcp-Name let a gateway route without parsing the body. Agents on current clients will keep working through the compatibility rules, but plan the move

    MCP has two generations in the field. The older one opens with an `initialize` request, and the server answers with an `Mcp-Session-Id` that both sides then carry for the life of the connection. The 2026-07-28 revision removes that entirely: there is no handshake and no session. Every request instead carries its own context, so a server can answer any request without remembering the one before it.

    How to fix it

    1. Stop depending on initializeRemove the code that expects an initialization step, and anything that stores or looks up per-session state keyed by `Mcp-Session-Id`. On the current revision neither arrives.
    2. Read the context out of _metaEach request carries the protocol version, the client's identity and its capabilities in a `_meta` object on the request. That is where the values you used to take from the initialize result now live.
    3. Route on the headers, not the body`Mcp-Method` and `Mcp-Name` mirror the method and the target name outside the JSON. A gateway can route on them without parsing the payload — but only if your server validates that they agree with the body, which `protocol.routing_headers` checks.

    If you build on an official SDK, updating the package usually carries the whole shift for you.

    What this check asserts

Step by step

What scout checked

pass Connectivity 0.2ms

Reachable, plain HTTP on this machine

pass Authorization 1.0ms

Open server, no credentials required

skip Credentials 0.0ms

Not needed

warn Handshake 0.4ms

acme-crm 2.4.0, protocol 2025-11-25 · 1 thing to improve

warn Protocol generation handshake.protocol_era

speaks a handshake revision: it uses initialize and Mcp-Session-Id, which 2026-07-28 removed

the current revision is 2026-07-28: requests carry their own protocol version, client identity and capabilities in _meta, sessions are gone, and Mcp-Method/Mcp-Name let a gateway route without parsing the body. Agents on current clients will keep working through the compatibility rules, but plan the move

fail Protocol 1.8ms

Mostly conformant · 3 issues, 1 thing to improve

fail Malformed JSON is rejected protocol.malformed_json

HTTP 200 for a truncated body

return 400 or -32700

fail tools/call without a name is rejected protocol.invalid_params

a tools/call with no name succeeded

validate params and return -32602

fail Unknown tool is reported protocol.unknown_tool

calling a non-existent tool returned success

return -32602 or an isError result

warn Unknown session id is rejected protocol.bogus_session

server answered a request carrying a session id it never issued

reject unknown session ids with 404

warn Catalog 0.9ms

3 tools · 1 thing to improve

warn Every tool has a useful description catalog.tools.descriptions

under 20 characters: list_orders

describe what the tool does, when to use it, and what it returns

fail Execution 1.2ms

3 of 3 tools ran cleanly · 1 issue

fail Tools reject missing required arguments execution.validation

3 tool(s) accepted a call with a required argument omitted

validate arguments against inputSchema before executing

pass Performance 2.4ms

Fast, slowest tool answers in 0.2ms

pass Resilience 0.2ms

Recovers from a lost session

3 tools

What an agent sees

ToolDescriptionBehaviourContract
find_customer Find a customer by email address or account number. Returns the account record. read only outputSchema
list_orders Lists orders. read only none
summarise_account Produce a short written summary of an account, suitable for an agent to relay to a customer. read only none
Latency

How fast it answers

ToolColdp50p95MaxErrors
find_customer 0.2ms 0.1ms 0.2ms 0.2ms 0
list_orders 0.2ms 0.2ms 0.2ms 0.2ms 0
summarise_account 0.2ms 0.2ms 0.2ms 0.2ms 0
Provenance

How this report was produced

scout
dev
Schema
v1
Started
Fri, 18 Sep 2026 18:04:19 UTC
Duration
8.2ms
Requests
40
Trace
d80b2165a37a669a2bde7b08824bf67c
Credentials
none