MCP Server
Tediware hosts a Model Context Protocol server at POST /mcp. Its tools cover the same ground as the REST API and the tedi CLI, with the same API key, the same rate limits, and the same service terms as every other endpoint: interchange inspection and reading and driving your own EDI traffic.
The server implements MCP revision 2026-07-28, which is stateless and has no initialize handshake or session id. Every call is a single HTTP POST.
Connecting
Configure your MCP client with the endpoint URL and your API key as a header:
URL: https://tediware.com/mcp
Header: Authorization: Key your-api-key-here
Every request also needs the transport’s own headers, which conforming clients send for you:
MCP-Protocol-Version: 2026-07-28
Mcp-Method: tools/call
Mcp-Name: transaction_list
The server checks that those headers match the request body and rejects the call with JSON-RPC error -32020 if they do not. The headers are what the rate limiter meters on, so a request that disagrees with itself cannot be metered correctly and is not accepted.
Standard and read-only API keys work here. A sandbox key is rejected with 403.
Exercise caution when choosing a key
An agent connected via MCP has all the permissions that its API key allows, and it decides for itself which tools to call. With a standard key, that includes sending documents to your trading partners, receiving documents into your flows, and resending past transactions.
This is exceptionally useful when you are building and testing new configurations, but should be treated with caution when dealing with production flows that are sending and receiving live data. A purchase order an agent sends is an order your partner may ship against. Documents your partners send are input to the agent too, and text inside one can steer an agent that reads it.
A read-only key is shown only the tools that change nothing: tools/list leaves out partner_send, partner_receive, transaction_resend, transaction_redeliver and suggestion_submit, and calling one of them answers as an unknown tool would. Everything else on this page is available to it.
- Give an agent a read-only key unless its job includes sending. An agent that answers questions about traces, errors and partner setup needs nothing more.
- If an agent does need a standard key, have your MCP client ask before it runs a write tool. The write tools carry the annotations clients use for that.
- Create a separate key for each agent, named for it, so you can delete one without disturbing your other integrations.
- With the
tediCLI, keep a read-only key and a standard key in separate profiles and turn on the standard one only when a task needs it. Switching between read-only and standard walks through the setup.
A read-only key still reads your transactions in full, including the business data in them. Whatever the key can read, the agent can pass to the model it runs on. Scope is fixed when a key is created; see Authentication for the full list.
Discovering the surface
server/discover reports the supported protocol versions and capabilities. tools/list returns the tools. Both are cacheable by the client (ttlMs) and never by a shared cache (cacheScope: private).
curl -X POST https://tediware.com/mcp \
-H "Authorization: Key your-api-key-here" \
-H "Content-Type: application/json" \
-H "MCP-Protocol-Version: 2026-07-28" \
-H "Mcp-Method: tools/list" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {
"_meta": { "io.modelcontextprotocol/protocolVersion": "2026-07-28" }
}
}'
The tools
Every tool maps onto an endpoint documented elsewhere in this reference, so the scoping, filters and error meanings are the ones described there.
X12 releases and inspection
x12_releases The release codes this server carries
edi_inspect Decode and validate a document
Your EDI traffic (structured)
whoami Which organization this key belongs to
transaction_list List EDI transactions
transaction_get One transaction in full
transaction_logs The processing log for a trace
transaction_resend Re-deliver an outbound transaction
transaction_redeliver Re-deliver an inbound transaction
trace_get One processing run, assembled
result_list List processing results
result_get One result
result_payload The data one result's step produced
feed_list The forward feed of documents and errors
artifact_get One artifact's document
Your configuration (structured, read-only)
partner_list List partners and what each exchanges
partner_get One partner: connection, envelopes, webhooks, sets, flows
connection_list List connections
connection_get One connection and the partners on it
envelope_list List envelopes
envelope_get One envelope and the partners using it, with role
webhook_list List webhooks
webhook_get One webhook and the partners delivering to it, with role
flow_list List flows, filtered by partner, direction or status
flow_get One flow with its nodes and edges
mapping_list List mappings and the partners using each
mapping_get One mapping with its current version and source
mapping_versions The versions of one mapping
implementation_list List your own implementations
implementation_get One implementation and what points at it
implementation_schema The JSON schema a mapping targets
implementation_guide The rendered guide (text only)
source_list List sources
source_get One source with its sample
Submissions (standard keys only)
partner_send Submit an outbound document
partner_receive Submit an inbound EDI document
suggestion_submit Report a confirmed gap to the Tediware team
Releases and inspection
x12_releases returns the release codes as structured data. edi_inspect returns its report as text and, as structured fields, the finding counts (errors, notices, complete) matching the headers the HTTP inspector sets, plus findings: each one’s severity, code, title, details, and the line and segment it cites, in document order.
implementation_guide returns the rendered guide as one text block, Markdown by default, and no structuredContent. The structure as data is implementation_schema, the JSON schema a mapping targets.
Data tools answer with structured content
The data tools return structuredContent in the same shape the REST endpoints return, including the pagination envelope with hasMore and nextCursor. It is your own data, so structured access is the point. The text block beside it is a one-line summary (the kind of record, its id, its status) rather than the same JSON again. Fields mean what the matching API page says: on a transaction, partnerKey is the partner recorded when the document was processed, and deliveredAt is when it left its delivery step (see EDI Transactions).
A result’s payload is the data its step produced, kept on the result; result_payload reads it as {format, contents}, and trace_get shows each result’s payload format and bytes so you can choose one before reading it. An artifact is a stored file a result points to in detail.artifacts; artifact_get downloads it. Most steps keep a payload, but only some store artifacts. The mapped document an implementation refused is a payload: read it from the failed result’s detail.incomingResultId. result_payload takes jsonPath (a dot-path into contents) and keysOnly (the shape only), and refuses payloads over 256 KB with a pointer to GET /platform/results/:id/payload.
The configuration tools (the partner_*, connection_*, envelope_*, webhook_*, flow_*, mapping_*, implementation_* and source_* tools) are in preview, as are the Partners and Configuration endpoints. Their output shapes may change without notice. partner_send and partner_receive are submissions, not configuration reads, and are not in preview.
edi_inspect and partner_receive send your document to the server. Scrub identifiers or personal data out of a document before an agent submits it: there is no local scrubbing step inside a hosted tool. tedi edi obfuscate is that step, and it runs entirely on the caller’s machine.
Arguments
Tool argument names are camelCase, matching the REST query parameters and the keys the tools return: transactionSetIdentifier, ackStatus, transactionId, partnerKey.
Arguments are validated against each tool’s schema before the tool runs, and every schema declares additionalProperties: false, so an unknown or misspelled argument is a refusal rather than a filter that silently did nothing. Three rules follow from the same principle:
- An empty string for an identifying argument (
trace,partner,reference,transactionId,node) is an error, not “no filter”. A blank shell variable should not return your whole organization. directionandstatusdeclare their allowed values and refuse anything else with the list, asackStatusandleveldo.warningsontransaction_listis a boolean:truefor transactions with at least one warning.- A
limitoutside 1 to 100 is an error rather than a silent clamp.
Compact rows for scanning
A full page of transaction_list runs to tens of kilobytes, more than many agents can take in one tool result. For questions that scan or count (“errors by partner this month”), pass compact: true to transaction_list, result_list or feed_list. Each row is then a fixed set of fields:
transaction_list id, createdAt, direction, usageIndicator, partnerKey, transactionSetIdentifier,
reference, status, acknowledgmentStatus, warningCount, deliveredAt,
traceGuid
result_list id, traceGuid, createdAt, nodeName, status, partnerKey, errorMessage
feed_list id, createdAt, direction, status, partnerKey, traceGuid, resultId, errorMessage
errorMessage is cut to 200 characters. Filters and pagination work as they do without compact. The REST endpoints take the same option as compact=true and return the same rows. To see everything about one row, get it by id.
Write tools
transaction_resend, transaction_redeliver, partner_send, partner_receive and suggestion_submit are annotated readOnlyHint: false so an agent framework can require confirmation before running them. transaction_resend and transaction_redeliver also carry destructiveHint: true: an accepted resend puts a duplicate document on your trading partner’s wire, and an accepted redelivery reaches your own endpoint again.
transaction_resend, transaction_redeliver, partner_send and partner_receive queue work rather than completing it inline. A successful call means processing started. Follow the returned traceGuid with trace_get, which carries a processing boolean so a polling agent has a defined end.
suggestion_submit completes inline. It is for a confirmed gap in Tediware, with evidence: body, tried and expected are required. It shares the limits of the suggestions endpoint: five a minute per key across both surfaces, 20 per organization in 24 hours, and a repeat of the same title or body within 24 hours returns the first suggestion with duplicate: true. Sandbox keys cannot reach MCP, so a sandbox agent uses POST /platform/suggestions.
Errors
Two kinds, and the difference is who can act on them.
Tool errors come back as an ordinary result with isError: true and a message in the text block: a record that does not exist, a document that will not parse, a filter value out of range. An agent can read these and try again.
Protocol errors come back as JSON-RPC errors with an HTTP status:
401 -32000 Missing or invalid API key
403 -32000 Organization disabled, sandbox key, or service terms not accepted
400 -32020 Headers disagree with the request body
400 -32022 Unsupported protocol version (the error lists the supported ones)
400 -32602 Unknown tool
404 -32601 Unknown method
400 -32700 The body is not valid JSON
500 -32603 An unhandled fault on the server, carrying your request id
The 403 cases carry a data.reason naming the specific condition: organization_disabled, sandbox_key_not_supported, service_terms_required.
Connecting a stdio client
Most MCP hosts launch a server as a subprocess over stdio rather than calling an HTTP endpoint, and most of them still open with the older initialize handshake this revision removed. A host that sends that handshake straight to /mcp gets a -32020 error naming the bridge below; it is not a credential problem. tedi mcp serve, from the tedi CLI, bridges both gaps: it answers the handshake locally, stamps this revision onto everything it forwards, and uses the key from tedi auth login so one never has to be written into an agent’s configuration file.
claude mcp add tediware -- tedi mcp serve
The bridge holds no tool logic. It forwards every request, so the tool list and descriptions you see through it are the server’s own.
Switching between read-only and standard
The tedi CLI can hold more than one key. Each profile is a directory under ~/.tedi-profiles/ with its own key and settings, and every command takes --profile <name> to choose one. With two profiles, your agent works read-only by default, and you turn on standard access only when a task needs to send.
-
On the API Keys page, create two keys: one read-only and one standard. Name them for the agent, for example “Claude Code (read-only)” and “Claude Code (standard)”.
-
Store each key in its own profile. Each command asks you to paste the key:
tedi auth login --profile read-only tedi auth login --profile standard -
Confirm each profile holds the scope you expect:
tedi whoami --profile read-only tedi whoami --profile standard -
Register each profile as its own MCP server:
claude mcp add tediware -- tedi mcp serve --profile read-only claude mcp add tediware-send -- tedi mcp serve --profile standardA client configured by file takes the same arguments:
{"command": "tedi", "args": ["mcp", "serve", "--profile", "read-only"]}. -
Keep
tediwareon andtediware-sendoff. In Claude Code,/mcplists both servers and turns each one on or off; other hosts have an equivalent setting. When a task needs to send, receive or resend, turntediware-sendon, and turn it off again when the task is done.
Keep only one of the two on at a time. With both on, the agent has the write tools anyway, and every read tool appears twice.
The in-app help assistant uses the same tools: signed in, it runs the read-only ones above (the configuration and traffic reads, never the submissions) as the signed-in user, so what it tells you about a partner or a trace is what these tools return.
Rate limits
MCP calls count against the same ceilings as the equivalent HTTP endpoints, not separate ones. x12_releases spends the same reference allowance an /api/x12 read spends; edi_inspect spends the inspection allowance; the data tools spend the platform allowance; transaction_resend and transaction_redeliver share the resend ceiling. See Platform Limits.