↓ Skip to main content
Rillsoft AI
Connect Rillsoft

Developers: the MCP server contract

MCP Errors, Undo and Safe Writes

Identify MCP errors, inspect state before retrying a write and understand the separate limits of undo, saving and switching files.

When an MCP call fails, first distinguish a transport rejection, an application rejection and a missing response. An interrupted connection does not prove that a change did not happen. Read the affected state before issuing another write.

This reference complements the MCP contract and Claude setup guide. Contract source: the generated tool catalogue from build 10.0.626, reviewed on 19 October 2026. The verification gaps identified below are not passed runtime tests.

Situation, response and safe reaction
#

SituationDocumented error or responseSafe reactionFollow-up check
Listener unreachableNo HTTP response; no MCP error code can be inferredCheck the application, server status, port and local addressStart with a read-only query
Wrong endpointHTTP 404 for /mcp/ instead of /mcpUse the exact configured pathCheck connection and tools/list
Missing or incorrect API keyHTTP 401Configure the correct Bearer header in the clientTest a read with the key; never log the key
Browser request with OriginHTTP 403Use a local MCP clientCheck the handshake without a browser Origin
Missing session / protocol headerHTTP 400Initialise a session and use a protocol version accepted by the serverCheck session headers and tool discovery
Write attempted in read-only modeTool absent from tools/list; direct call rejectedUse reads for analysis; enable writes only after deliberate approvalRead the available tool list again
Invalid argument schemaJSON-RPC -32602, error.data.code and error.data.fieldCorrect arguments against inputSchemaInspect the field path; rejection occurs before the document model
Invalid dateisError: true, _meta.errorCode: invalid_date_formatSupply a supported date formatRead the affected activity before a corrected write
Application conflict at commitTool error with a conflict reason; automatic rollback under the contractExplain the fixed date, calendar or resource conflict; do not relax constraints automaticallyCompare tree and conflicts with the initial state
Function unavailable under the licenceFor example, license_missing for licensed favourite functionsCheck the function and licence; do not bypass the restrictionOffer only an available alternative
Session limit reachedJSON-RPC -32000Close your own unused sessionsInitialise again, then read state
Response lost after a writeNo reliable success or failure evidenceDo not retry blindly; reconnect and inspect stateCompare UUID, changed fields, assignments and conflicts

HTTP cases come from the product’s access-control documentation. Codes come from the developer contract; error responses do not all have the same structure. No unverified code is added for read-only rejection. On 19 October 2026, DE and EN tests on build 10.0.626 deliberately discarded a write’s response body. The next read found that duration had already changed from 16 to 32 hours. Without retrying, undo restored the initial tree. This tests handling of a lost response, not a server crash or every possible network interruption.

Handle protocol and tool errors separately
#

A JSON-RPC error appears in error. An application rejection may instead return a normal JSON-RPC result containing isError: true. Check both levels. structuredContent describes successful outputs and does not replace error handling.

This deliberately invalid argument example belongs only on a test dataset:

{"name":"rillsoft_task_create","arguments":{"name":"Date check","start":"32.13.2020"}}

The documented machine-readable code is invalid_date_format. The English runtime text in the existing contract evidence is:

Invalid value for 'start': '32.13.2020' - DD.MM.YYYY hh:mm or YYYY-MM-DDThh:mm is expected

Handle the code rather than matching the English sentence. The German page shows the German evidence. Messages follow the language of the running Rillsoft Project build; translating a website does not change the application’s language.

Approve changes before writing, and saving before file operations
#

Before a change, establish the source file, target object and intended effect. Read the UUID from the current tree and show the proposed old and new values. Ask about missing durations, ambiguous people, unsuitable roles or unclear dates. Permission to connect does not decide these planning questions.

For an approved duration change, keep the steps separate; replace <TASK_UUID> with a UUID from the current tree:

{"name":"rillsoft_project_tree_get","arguments":{}}
{"name":"rillsoft_task_update","arguments":{"uuid":"<TASK_UUID>","durationHours":24}}
{"name":"rillsoft_project_tree_get","arguments":{}}
{"name":"rillsoft_project_conflict_list","arguments":{}}

Each line is a separate tools/call parameter object. Only after checking the result and obtaining approval to save should you call rillsoft_project_file_save, or rillsoft_project_file_save_as with a confirmed absolute path for a new file. Overwriting is a separate decision. The project examples put these steps in context.

What undo reverses
#

Under the contract, one mutating tool call creates one undo step. The application UI shares this history: an intervening manual edit may be the latest step. Never apply a guessed number of undo operations to an unknown state.

{"name":"rillsoft_history_undo","arguments":{}}
{"name":"rillsoft_project_tree_get","arguments":{}}
{"name":"rillsoft_project_conflict_list","arguments":{}}

Compare the tree with the reference captured before the change. Check affected fields and successor dates. A successful undo response alone does not establish that every change in a longer conversation has been reversed. A project built through many calls requires multiple editing steps; the employee-assignment assistant can make several assignments in one step.

Saving, file changes and sessions have separate limits
#

OperationLimit
rillsoft_project_file_save / rillsoft_project_file_save_asFile access without an undo step. Undo in the document does not restore an earlier file on disk.
rillsoft_project_create / rillsoft_project_file_openA new command history starts; earlier steps belong to the previous dataset.
discardChanges: trueDiscards unsaved state during the relevant file/session operation; use only after approval is clear.
rillsoft_portfolio_project_files_saveSaves included project files, not the .rpp portfolio file.
Ending an MCP sessionNo promise to undo or save the open document.
Changing viewsMay affect presentation state and the modified flag; restore the original view and do not save a pure analysis.

Reset the analysis view before switching files. Test recovery exclusively on a copy: read the initial state, make one change, undo it and compare; separately save and reopen, then compare again. The documented walkthrough includes this file roundtrip. The test-copy replay on 19 October 2026, build 10.0.626, passed in both languages: undo restored the full tree, saving/reopening preserved activity data and cleared the previous history. Invalid dates and schema errors left the tree unchanged. A server crash during a change was not induced.

Procedure for an uncertain write outcome
#

  1. Stop sending writes. Record the call, arguments and time without credentials.
  2. After reconnecting, identify the project that is actually open.
  3. Read the affected activity and its assignments. For a creation call, use the previous tree and any returned UUID to determine whether the object already exists; names alone are not unique.
  4. If state matches the intended result, do not write again. If unchanged, resolve the cause and obtain approval before a new attempt. If state remains unclear or differs partly, stop and show the discrepancy.
  5. After correction, check successor dates and conflicts; saving remains separate.

This is a state-verification procedure, not a promise of atomic retries. The Rillsoft Project product page explains product scope and licensing options.

Product version
Rillsoft Project 10.0.626
Last verified
2026-10-19