Creatio Case Toolkit MCP Server
You can perform read-only Creatio OData lookups via three MCP tools.
List allowed OData entity sets, base URL, and row cap.
Query records from an entity using OData
$filter,$select,$orderby,$top(clamped to 50), and$expand.Fetch a single record by its GUID Id.
Use the results from AI clients like Claude Code/Desktop for support-case investigation, but no create, update, delete, or write operations are available.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Creatio Case Toolkit MCP Servershow all open cases assigned to John Doe"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Creatio Case Toolkit
A read-only toolkit for working with Creatio Support cases:
an MCP server that exposes Creatio's OData API to AI clients (Claude Code, Claude Desktop, โฆ), and
a local web app that lets non-technical users look up cases by clicking menus โ with descriptions, conversation timelines, inline attachments, and optional AI analysis powered by the Claude CLI.
Everything is read-only by construction: the HTTP layer only ever issues GET, there are no create/update/delete paths, and an entity allowlist + row cap keep the blast radius small. Safe to point at production.
Status: early/active. Read-only today; a gated write-back capability (draft & post case updates with human approval) is on the roadmap.
Features
๐ Read-only by design โ GET-only client, no write tools, entity allowlist,
$topclamp.๐งฐ MCP server โ
creatio_query_records,creatio_get_record,creatio_list_allowed_entities.๐ฅ๏ธ Local web app โ look up cases by owner, case number, account, or "all recent"; filter by status; choose detail depth.
๐งต Rich case detail โ HTML-stripped descriptions, merged feed + email timeline, and inline screenshots/attachments proxied from Creatio's FileService.
โจ AI analysis (optional) โ Summarize & prioritize, Common themes, Next actions, or free-text Q&A over the loaded cases; streamed live via the local Claude CLI (uses your existing Claude login โ no API key).
๐ Workspace analysis โ point the app at up to 3 folders you're working in and get a read-only code analysis of them together, capped at 10 top-level files so it stays fast. Reports are stored under
.analysis/and reused by the bundled skills.๐ฏ Case-scoped analysis โ with a case bound, Analyze for SRxxxxxxxx reads only the files related to that case (searched in subfolders too, ranked by the case's keywords and school code), so a fix starts from the right handful of files instead of the whole folder.
๐งฉ Case โ code โ fix โ the Workspace tab runs in three phases: pick the case, point at the folders, then Plan the fix. You get every change as a before/after diff; nothing is written until you press Apply, and applied edits are left uncommitted for review.
โ๏ธ In-app settings โ paste/refresh SSO cookies, base URL, allowlist, row cap; no VS Code required.
๐ก Live progress โ the search streams per-case progress with a percentage bar.
Related MCP server: mcp-sqlserver-readonly
Repository layout
creatio_case_lookup/
creatio_client.py Shared read-only OData client (auth, cookies, GET, file download)
case_lookup.py Case-lookup query recipes (search, description, timeline, attachments)
claude_run.py Generic Claude CLI runner (spawn, NDJSON stream, tool clamping)
analyze.py Case AI analysis prompts (isolated run: no tools, no MCP)
workspace.py Workspace path validation, file enumeration, .analysis/ store
case_brief.py Bound case + stored case brief (.analysis/cases/)
case_keywords.py Case text -> sanitized, weighted search terms
case_files.py Recursive search + ranking of the files related to a case
case_scope.py Keywords + related files for one case
fix_plan.py Fix planning (read-only) + reviewed apply (plain Python)
analyze_workspace.py Read-only workspace analysis (Read/Glob/Grep only)
workspace_cli.py CLI over the workspace store, used by the skills
server.py Local web app (FastAPI): static hosting + JSON/SSE API
mcp_server.py MCP server (thin surface over creatio_client)
test_auth.py Standalone credential check
tests/ pytest suite
public/ Web app UI (vanilla HTML/CSS/JS, zero runtime deps)
.claude/skills/ creatio-case-lookup, workspace-analysis, creatio-case-fix
.analysis/ Stored workspace analyses + case briefs (git-ignored local state)
start-app.bat One-click launcher for the web app (Windows)
.env.example Copy to .env and fill inQuick start
Prerequisites:
Python 3.12+.
Claude CLI (optional, for the AI features):
npm i -g @anthropic-ai/claude-code, then runclaudeonce to sign in.
git clone <your-repo-url> creatio-case-toolkit
cd creatio-case-toolkit
python -m venv .venv
.venv\Scripts\python -m pip install -e ".[login,dev]" # [login] = browser login, [dev] = pytest
.venv\Scripts\python -m playwright install chromium # only if you have neither Chrome nor Edge
copy .env.example .env # then edit .env (see Configuration)
.venv\Scripts\python -m creatio_case_lookup.test_auth # confirm credentials work (โ Success)Run the web app:
.venv\Scripts\python -m creatio_case_lookup.server # starts the server, opens http://127.0.0.1:3000On Windows you can just double-click start-app.bat. It finds Python 3.12+, creates the .venv, installs packages (and reinstalls them whenever pyproject.toml changes), creates .env from .env.example if there isn't one, and prints a setup check before starting. The same checklist is the app's first tab, Setup, with a fix for each item. Run the check on its own with .venv\Scripts\python -m creatio_case_lookup.preflight.
The MCP server is already registered โ this repo ships a project-scoped .mcp.json, so Claude Code picks it up automatically when opened on this folder (after the .venv exists). Approve the server when prompted.
To register it somewhere else instead:
claude mcp add creatio-readonly -- <repo>\.venv\Scripts\python -m creatio_case_lookup.mcp_serverConfiguration
All settings live in .env โ the MCP server loads it from the project root itself (next to the creatio_case_lookup package), so its registration needs no env block and both the server and the web app read the same file. Never commit .env โ it holds live credentials/cookies (it's git-ignored by default).
Variable | Purpose |
| Your Creatio URL, e.g. |
| Forms-auth service account (Mode 1) |
| SSO session cookies (Mode 2) |
| Comma-separated entity allowlist (e.g. |
| Max rows per query (default 50) |
| Web app port (default 3000) |
| Set |
| Fallback model, used only when |
| The 1-3 folders the Workspace tab analyzes together (normally set from the UI) |
| Total top-level file count (all folders) above which the app asks before analyzing (default 10) |
| Hard timeout for one workspace analysis (default 300000) |
| The case bound in the Workspace tab's phase 1 (normally set from the UI) |
| Hard timeout for one fix-planning run (default 600000) |
Authentication
The client auto-selects a mode based on which vars are set.
Mode 1 โ Forms auth (recommended): a local, least-privilege, read-only Creatio service account (
CREATIO_LOGIN+CREATIO_PASSWORD). Re-authenticates automatically on expiry.Mode 2 โ Cookie auth (SSO tenants): paste a browser session's cookies (
.ASPXAUTH,BPMCSRF,BPMLOADER) from DevTools โ Application โ Cookies. Cookies expire in hours; refresh them in.envor the app's Settings tab and the next query picks them up โ no restart needed.
Verify either mode with .venv\Scripts\python -m creatio_case_lookup.test_auth.
Web app
Lookup tab โ choose who (assignee / case number / account / all recent), which statuses, and how much detail (summary, full description, timeline, latest update, extra fields), then Search. Results stream in with a progress bar.
Attachments โ screenshots embedded in descriptions and feed posts render inline (click to enlarge); email attachments appear as thumbnails. Images are streamed through a read-only
/api/fileproxy restricted to file entities + GUID ids.Workspace tab โ three phases: 1 pick the case you're working on, 2 point at the folder(s) and run a read-only analysis, 3 plan a fix, review every edit as a diff, and apply it (see below).
Settings tab โ base URL, cookies, allowlist, row cap, plus Test connection.
The server binds to 127.0.0.1 only. Inside this repo it writes your local .env (Settings, Workspace path, bound case) and .analysis/ (workspace reports, case briefs, fix plans and pre-edit backups). The only time it writes outside this repo is when you press Apply on a fix plan you have reviewed โ never during an analysis, and never without that approval.
AI analysis
With the Claude CLI installed and logged in, the results view shows an "Analyze with AI" bar โ Summarize & prioritize, Common themes, Next actions, or a free-text question, streamed live and rendered as Markdown (copy / download as .md). Tick row checkboxes to analyze a subset; each row also has a "โจ analyze this one" button.
Enable:
npm i -g @anthropic-ai/claude-code, then runclaudeonce to sign in. Uses your Claude subscription โ no API key.Runs
claude -plocally, isolated (no tools, no MCP, empty temp cwd); only the selected cases' text is sent โ never your cookies. Uses the model, effort and output style from Settings โ Claude settings (saved to.claude/settings.json; default Claude Opus 5.5,claude-opus-5-5, medium effort, Concise). Pick Sonnet 5 or Haiku 4.5 there for cheaper/faster runs.
Workspace analysis
The Workspace tab takes the absolute path of the folder you're working in โ plus up to two more via + Add another folder โ saves them to .env (effective immediately, no restart), and runs a read-only analysis.
Several folders, one report. The folders are analyzed together as a single workspace, which is what you want when a fix spans a report template and the shared includes it pulls in. The first folder is the analyzer's working directory; the others are granted explicitly with
--add-dir. Adding or removing a folder makes it a different workspace with its own stored report.Read-only by construction. The child process is spawned with
--tools Read,Glob,Grep, which removesEdit,WriteandBashfrom its tool schema โ not merely from its permissions. Deny rules additionally block.env,*.pem,*.keyand SSH keys, so an analysis of this repo cannot read your Creatio cookies. Every tool call is recorded in the report's sidecar, so you can see exactly which files were touched.Capped at 10 top-level files in total so a run stays fast. Only files directly in each folder count โ no recursion โ and the cap applies to the sum across folders. Above the cap the app does not start: it tells you the run will take longer and offers "analyze all N anyway" or a single-file pick. The API enforces the same rule, so a stray request can't kick off a huge run either.
Excluded automatically: secret-bearing files (
.env, keys, certs โ counted but never listed), files over 512 KB, non-text files, and the usual build/dependency directories.Stored as
.analysis/<slug>/analysis.mdplus a JSON sidecar (files analyzed, tool calls, model, cost,truncatedflag), indexed in.analysis/index.json. The folder is git-ignored local state โ safe to delete.
Case-scoped analysis
With a case bound in phase 1, the button reads Analyze for SRxxxxxxxx and analyzes only what that case touches โ which is usually a handful of files in a folder of thousands.
Finding the related files โ fast and model-free. The app turns the case's subject, description and recent emails into a short list of keywords (school codes like
EP-JAMand file names likeEP-JAM-RC.cfmweigh the most), then searches the folders recursively. A folder named after the school code is walked first; files are ranked by path and content matches, with words that appear in almost every file (like "report") counting for little; one hop of<cfinclude>is followed; and anything scoring well below the best match is dropped. The result is capped at the file limit, so there is no over-cap prompt in this mode. On a reports root of 1,700+ school folders this picks the right school's files in a few seconds.Preview first. Preview related files shows the chosen files (with why each was picked) โ without running Claude. Analyze whole folder instead keeps the classic analysis one click away.
What the analysis receives from the case. Only the app-extracted keywords (lowercased, reduced to a safe alphabet, max 40 characters each) and the file list the app picked โ never the client's wording. The fix plan, as before, does read the case text, with no write tools.
Stored as
.analysis/<slug>/cases/<SR>.mdplus sidecar (selected files and reasons). It goes stale when a selected file changes or the case is re-fetched.
The skills use the same logic: python -m creatio_case_lookup.workspace_cli scope <SR> prints the keywords and related files.
Accepted limitation: because the analysis child runs in your folder, that folder's own
CLAUDE.mdis loaded into its context and cannot be suppressed by any current flag. The folder is one you chose, and--toolsbounds the worst case to "read files here and write a misleading report" โ but if you analyze a directory you don't trust, read the report with that in mind.
Case โ code โ fix
The Workspace tab is case-first, because that's how the work actually arrives: a client reports something, you work out which folder it lives in, then you fix it.
Case โ search by number, owner, account or "all recent" (the same queries as the Lookup tab) and pick one. The app fetches its description, full conversation and attachments and stores them as a brief in
.analysis/cases/<SR>.json; the case number goes in.envasCREATIO_WORKSPACE_CASE. Both survive a browser reload and a fresh Claude Code session. Refresh re-pulls the case when it has moved on; Unbind clears it.The description is rebuilt into a readable list โ support cases are usually numbered asks, and Creatio's HTML arrives flattened โ with each ask's continuation lines and indented sub-points kept with it.
Attachments show as thumbnails (click to enlarge) or open-in-tab links, streamed through the read-only
/api/fileproxy. An image can be saved straight into a workspace folder (โ save to folder) when the client wants it used in the template โ e.g. a school logo. The filename is editable, since the template usually references a specific name.That save is the only write outside this repo besides an approved fix apply, so it is narrow: images only (no
.svgโ it can carry script), the bytes must actually be that image type (leading bytes are checked, so client-supplied content namedlogo.pngis rejected and a JPEG can't be saved as.png), the target must be a configured folder, the client-supplied name is reduced to a bare filename, 10 MB cap, and replacing an existing file needs a second confirm and copies the original to.analysis/assets/first. Listing them needsCaseFileinCREATIO_ALLOWED_ENTITIES; without it the brief records a caveat instead of failing. Their contents are not read when planning a fix โ the planner is given the filenames only, so a logo's exact colours still have to come from the case text.Working directory โ the folders and their read-only analysis, as described above: case-scoped when a case is bound, whole-folder otherwise.
Fix โ press Plan the fix. A read-only pass reads the case, the stored analysis (the case-scoped one when it exists) and the relevant files, then shows you each proposed change as a before/after diff with its reasoning, risks and what it does not fix. Nothing has touched disk at this point. Press Apply and the edits are written and left uncommitted and unstaged so you review the diff yourself. Originals are backed up first, so it's reversible even outside git.
The review also breaks the case into what the client actually asked for โ using the case's own numbering where it has any โ marks each ask addressed, partly addressed or not addressed, and tags every edit with the ask it serves. So you can check the plan against the client's email rather than inferring intent from a diff, and see at a glance which parts were left alone.
An applied plan stays on screen as a read-only record of what it changed, and can't be applied twice โ press Plan the fix again for a fresh one.
Those addressed labels are the model's own claim, not something the app can verify. On the default Opus model they hold up โ an ask needing a capability the code doesn't have comes back not addressed. Weaker/cheaper models over-claim: Haiku marked "add a PDF export button" as addressed and proposed a button that wouldn't do it. If you set
CREATIO_APP_MODELto something cheaper, treat the coverage labels as a prompt to check, not an answer.
The phases are softly ordered โ phase 2 works with no case bound, so you can still just analyze a folder. Phase 3 stays disabled, naming what's missing, until a case, folders and a stored analysis all exist.
How the fix button stays safe. Case descriptions and emails are prose written by clients and third parties, so the model that reads them is given no write tools at all โ
Read,GlobandGrepare the only things in its schema, with noBash, noWebFetchand noWebSearch. It can only propose a structured list of edits. The app applies them, and before writing anything it re-checks that each file is one it is allowed to edit โ a top-level source file of a configured folder, or one of the files the case-scoped analysis selected in a subfolder โ and that the "before" text still matches exactly once. So the worst a malicious instruction buried in a case could achieve is a bad patch โ one you see as a diff, that can't reach a file outside your workspace, that can't execute or phone home, and whose original is backed up.Apply is all-or-nothing: if any file changed between planning and approval, nothing is written and you re-plan. Plans, and the originals they replaced, are kept under
.analysis/fixes/<plan id>/.What the folder setting does and does not bound. It bounds edits exactly โ only a top-level source file of a configured folder, or a file the case-scoped analysis selected inside one, can be written. It does not bound reads:
GlobandGreptake absolute paths, so the planning pass can and does read shared code elsewhere on disk (tracing a report template back intoReportCardRoot, say) โ everything except the denied.env, key and certificate patterns. That is usually what you want, since a fix often depends on an include outside the folder. The consequence to know: a plan may propose an edit to a file it could read but cannot write, and that edit shows as can't apply with a note to re-run the case analysis so it's selected, or add the folder in phase 2, and re-plan.
The in-app button needs no setup. The creatio-case-fix skill remains available for when you want to work a case through conversationally โ pushing back on the diagnosis, asking for alternatives โ rather than accepting or rejecting a diff. Run /creatio-case-fix in Claude Code from this repo; because the Creatio tools are project-scoped here while your files live elsewhere, it may ask you to /add-dir <workspace path> first, and it checks that before spending effort on a recommendation.
Bundled skills
Three skills in .claude/skills/ drive these workflows from a Claude Code conversation:
Skill | What it does |
| Interactive case lookup โ who, which statuses, how much detail |
| Analyzes the working folder(s) and stores the report (same 10-file total cap and over-cap prompt as the tab); with a case bound, points you at the case scope instead |
| Reads a case's description + conversation, loads the case-scoped analysis (or computes the case scope: related files), recommends a fix, and โ only after you approve โ applies the edits and leaves them uncommitted for review |
The skills and the app share one implementation of the cap rule and the artifact schema via python -m creatio_case_lookup.workspace_cli, so reports from either side are interchangeable.
Because the Creatio MCP server is project-scoped in .mcp.json, creatio-case-fix needs Claude Code running in this repo, while the files it edits usually live elsewhere. If it can't read your workspace, run /add-dir <workspace path> (or start with --add-dir) and retry.
MCP server
Tool | Description |
| Show base URL, allowlist, and row cap |
| OData query ( |
| Fetch one record by GUID |
Registered via the project-scoped .mcp.json in this repo โ config comes from .env, so no env block is needed:
{
"mcpServers": {
"creatio-readonly": {
"type": "stdio",
"command": ".venv/Scripts/python",
"args": ["-m", "creatio_case_lookup.mcp_server"],
"env": {}
}
}
}Requires the project's .venv (see Quick start). Anything set in an env block would take precedence over .env, since .env loading never overrides vars already in the process environment.
Foreign keys like
OwnerId/AccountId/StatusIdare not filterable โ filter through navigation paths (Owner/Id,Account/Id,Status/Name). SeeCASE-QUERY-REFERENCE.mdfor the full query recipes and gotchas.
Security & data handling
Read-only: the client issues HTTP
GETonly; there is no write path to Creatio anywhere in the codebase.Local & single-user: the web app binds to
127.0.0.1, with no app-level auth by design.Secrets stay local: cookies/credentials live in
.env(git-ignored) and are masked in the UI; AI analysis receives only case text, never cookies.Bounded reach: entity allowlist +
$topclamp; the file proxy is limited to a fixed set of file entities and GUID ids.Workspace analysis is read-only too: the analysis child gets
--tools Read,Glob,Grep, which removesEdit/Write/Bashfrom its tool schema, plus deny rules for.env, keys and certificates.--safe-modeand--setting-sources userstop the analyzed folder's own.claude/settings.jsonhooks from running. Every tool call is recorded in the report sidecar.Applying fixes is gated on you: both routes โ the Workspace tab's Plan the fix and the
creatio-case-fixskill โ propose a change, wait for explicit approval, and leave the edits uncommitted. Nothing is ever committed, staged or pushed for you.The model that reads case text never holds a write tool: planning runs with
--tools Read,Glob,Grepand noBash/WebFetch/WebSearch, and returns a structured edit list. The app applies it, re-verifying that every target is a top-level source file of a configured folder (or a file the case-scoped analysis selected inside one) and that each "before" string still matches exactly once. Apply is all-or-nothing, and originals are backed up under.analysis/fixes/.
Roadmap
โ๏ธ Write-back (Stage 3): draft case replies / status updates with AI, then post them to Creatio on explicit human approval, and verify the write succeeded. This is the planned next step and will be gated, audited, and opt-in โ the read-only default stays.
OAuth 2.0 client-credentials auth for unattended SSO use.
Pagination past the 50-row cap in the UI; attachment-count badges.
Optional
ActivityFileinline email images.
Agentic maturity: today the toolkit is Stage 2 โ Multi-Step (multi-step, multi-tool, read-only "generate but don't run"); the in-app Analyze feature is Stage 1 โ Guided Task. Write-back is what moves it into Stage 3 โ Autonomous Workflow.
Commands
Run each with .venv\Scripts\python -m <module>:
Module | Does |
| Start the web app |
| Start the MCP server (stdio) |
| Verify credentials without starting anything |
| Workspace store CLI ( |
| Run the test suite ( |
Development
Code lives in
creatio_case_lookup/; tests intests/(pytest, one file per module). Everything network- or subprocess-bound isasync; pure logic is plain functions.The browser UI in
public/is plain HTML/JS with no build step. Its contract withserver.pyโ routes, JSON keys (camelCase), SSE event names โ must change on both sides together.On-disk formats under
.analysis/(reports, sidecars, briefs, plans) keep camelCase keys so existing stored data stays readable.
License
Add a license (e.g. MIT) before publishing.
Available Tools
3 toolscreatio_get_recordA
Fetch a single Creatio record by its GUID Id (read-only GET).
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record GUID, e.g. 'f3ed4f55-894b-42bc-b5a1-f10b9d0bc03f'. | |
| entity | Yes | OData entity set name, e.g. 'Case'. | |
| expand | No | OData $expand for lookups. | |
| select | No | Columns to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly discloses the read-only, non-mutating nature via 'read-only GET', which is a key behavioral trait. It does not detail error handling or edge cases, but for a simple fetch operation, the transparency is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no redundancy. Every phrase ('Fetch', 'single', 'by GUID Id', 'read-only GET') contributes to clarity and utility.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-record fetch with no output schema, the description covers the essential usage and safety aspects. It does not explain return format or error behavior, but the operation is simple enough that the description is largely complete, especially given the schema already documents all parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each parameter having a meaningful description (e.g., id includes an example, expand and select are briefly defined). The tool description adds no additional parameter semantics; the baseline of 3 applies because the schema already provides full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (Fetch), the resource (Creatio record), and the exact identifier (GUID Id). The 'read-only GET' suffix further clarifies the operation and differentiates it from sibling tools like cretio_list_allowed_entities and creatio_query_records, which handle listing and querying, respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The wording 'single record by its GUID Id' gives clear context for when to use this tool โ when you have a specific record ID. It does not explicitly name alternative tools or exclusions, but the context implies it is not for listing or multi-record queries, which are covered by siblings. This is a clear usage hint without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatio_list_allowed_entitiesA
List the Creatio OData entity sets this server is permitted to read. If the allowlist is empty, all entities are readable.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses an important behavioral nuance: if the allowlist is empty, all entities are readable. This adds context beyond a simple listing, though it does not describe the exact return format or pagination, which are minor for a metadata list.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the primary purpose, and includes a one-sentence edge case. Every word adds value without redundancy. This is exemplary conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given low complexity, zero parameters, and no output schema, the description covers the core functionality and a key edge case. It is sufficient for an agent to understand what the tool does, though lacking an explicit mention of return structure is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema provides complete coverage. The baseline for 0 params is 4, and the description does not need to compensate. It accurately reflects that no parameters are required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'List' and identifies the resource 'Creatio OData entity sets' along with the context 'this server is permitted to read.' It clearly distinguishes from siblings like creatio_query_records and creatio_get_record, which focus on records rather than metadata discovery.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage as a discovery step before querying or getting records, but it does not explicitly state when to use this tool versus alternatives or provide exclusions. The sibling names suggest a workflow, but the description itself lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
creatio_query_recordsA
Query records from a Creatio entity via OData (read-only GET). Use OData syntax for filter/orderby, e.g. filter: "Number eq 'SR00042038'".
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Max rows (clamped to 50). | |
| entity | Yes | OData entity set name, e.g. 'Case' or 'Contact'. | |
| expand | No | OData $expand for lookups, e.g. 'Owner'. | |
| filter | No | OData $filter expression. | |
| select | No | Columns to return, e.g. ['Id','Number','Subject']. | |
| orderby | No | OData $orderby, e.g. 'CreatedOn desc'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description explicitly discloses 'read-only GET', which is key behavioral information indicating no mutation. It does not mention that 'top' is clamped to 50 or other potential behaviors like pagination, but the read-only disclosure is valuable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: the first states purpose, the second gives usage guidance with an example. Properly front-loaded and concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query tool with no output schema, the description covers purpose, safety, and includes a usage example. It does not describe the return format, but that is implied by 'records' and the OData context, and the schema fills in parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds a concrete OData filter example ('Number eq \'SR00042038\'') and reinforces that filter/orderby use OData syntax, which helps the agent construct valid parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool queries records from a Creatio entity via OData (read-only GET), specifying the verb, resource, and method. It also distinguishes from siblings: creatio_get_record for a single record and creatio_list_allowed_entities for listing entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides usage instruction for OData filter/orderby with an example, but does not explicitly state when to use this tool versus alternatives like creatio_get_record or creatio_list_allowed_entities. The context is implied rather than explicit about exclusions.
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.
3 tool updates
v0.1.0- First observed
creatio_get_record - First observed
creatio_list_allowed_entities - First observed
creatio_query_records
TDQS
Scored across 3 tools
Each tool has a clearly distinct purpose: listing allowed entities, querying records, and fetching a single record. There is no overlap or ambiguity between them.
All tools follow the same verb_noun pattern with the consistent 'creatio_' prefix: list_allowed_entities, query_records, get_record. The naming is uniform and predictable.
With 3 tools, the set is within the typical well-scoped range. Each tool serves a necessary role in the read-only OData use case, with no redundant or missing infrastructure.
For a read-only OData server, the tool surface is complete: it covers entity discovery, record querying, and single-record retrieval. No obvious gaps exist for the stated purpose.
Maintenance
Related MCP Connectors
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Bureau-operated public read-only MCP service for public Context Packets and Cases.
Read-only MCP server for AIStatusDashboard status, incidents, metrics, and fallback recommendations.
Read-only MCP server for public WeJob jobs, formations, and companies.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceRead-only MCP server for querying Movidesk tickets through the public Movidesk API.8 npm-
- AlicenseNot gradedqualityDmaintenanceRead-only SQL Server MCP server enabling safe database queries, table listing, and schema inspection with built-in security protections.MIT
- FlicenseNot gradedqualityFmaintenanceRead-only MCP server for IFRC GO data, secured with Microsoft Entra ID OAuth/JWT, exposing datasets as MCP tools with rate limiting and PII filtering.-
- AlicenseNot gradedqualityBmaintenanceRead-only MCP server that exposes SAP Business One Service Layer and Cisco CCWR contract search APIs for querying sales orders, delivery notes, business partners, and service contracts, without modifying data.MIT