crm-cases
Acts as the production CRM backend (Salesforce / Data 360) for the case resolution agent, providing tools to look up cases, customer profiles, and orders, and to take actions such as issuing refunds, updating cases, and drafting customer emails against the CRM.
Provides a local SQLite-backed CRM (with a unified_profile view standing in for a Data 360 customer profile) that the agent reads cases, customers, and orders from and writes refunds and case updates to, serving as a swappable stand-in for a production CRM.
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., "@crm-casesResolve case CS-1002 and issue the customer's refund"
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.
FDE Case Resolution Agent
Showcase app 3 of 3 - Advanced / agentic: function calling, ReAct loop, MCP, A2A, self-correction, human-in-the-loop. An Agentforce-style service agent that takes real actions (refund, update case, draft email) against a CRM - with the controls an enterprise needs before it touches money.
┌──────────────── Agent harness (agent.py) ────────────────────┐
"Resolve CS-1002" ─►│ bounded ReAct loop · loop detection · error-streak fail-safe │
│ policy gate · HUMAN APPROVAL · result truncation · tracing │
└───────┬───────────────────────────┬──────────────────────────┘
tool calls (LLM) │ │ A2A (JSON-RPC message/send)
Claude/OpenAI/Gemini/Grok │ MCP (stdio JSON-RPC) ▼
▼ Refund Policy Agent (/.well-known/agent-card.json)
crm-cases MCP server eligibility · window · amount cap · approval level
get_case · get_customer_profile · get_order
issue_refund · update_case · draft_customer_email ──► SQLite "CRM" + unified_profile view (Data 360 role)
│
traces/runs.jsonl (OTel-shaped spans) ──► dashboard.html (KPIs)List of FDE Showcase Apps
App Name | 🎯 Core Focus & Architecture | 🧬 Lineage & Progression | 💡 Key Use Cases | 💼 How to Showcase in Interviews |
⚡ Basic / Single-Turn• Structured outputs via provider JSON Schema• Few-shot prompt engineering & data-delimited inputs• Deterministic verifiers & Pydantic auto-repair loops ($\le 2$ retries)• Single-pass CLI / Web UI / Golden Evals | 🎯 Level 1: Entry FoundationEstablishes reliable, single-turn LLM input/output contracts, schema enforcement, repair loops, and deterministic verification before attempting stateful or multi-step logic. | • Customer discovery call transformation (notes $\rightarrow$ validated Agentforce-style blueprints)• Automated static analysis & Apex code review for bulk-safety• Rapid MVP 5-day execution planning | Highlight Systems Reliability & Schema Integrity:• Explain how you eliminate LLM output variance using forced schemas and auto-healing Pydantic loops.• Emphasize your zero-SDK stdlib adapter approach to avoid vendor lock-in across Claude, OpenAI, Gemini, and Grok. | |
🧠 Intermediate / Grounded Context• Role-Based Access Control (RBAC/ACL) pre-filtering• Hybrid search (BM25 + Dense Vectors combined via Reciprocal Rank Fusion)• Heading/table-aware atomic chunking• Input injection stripping & pre-prompt evidence gating• Strict lexical citation verification | 📈 Level 2: Contextual EscalationEvolves Level 1's single-turn validation into retrieval-augmented generation (RAG), focusing on enterprise data boundaries, security guardrails, context management, and hallucination prevention. | • Secure enterprise internal search & document Q&A• Role-restricted knowledge access (e.g., HR vs. Employee compensation data)• Injection-resistant document consumption• Zero-hallucination support portals | Highlight Enterprise Security & Groundedness:• Showcase the pre-retrieval ACL filtering that prevents restricted context from ever touching vector scoring or LLM prompts.• Detail your anti-hallucination pipeline (evidence gate + lexical support check) that fails closed rather than guessing. | |
🤖 Advanced / Agentic Execution• Multi-step ReAct loop with loop detection & error streak fail-safes• Model Context Protocol (MCP stdio JSON-RPC) tool execution• Agent-to-Agent (A2A JSON-RPC) policy communication• Deterministic Human-In-The-Loop (HITL) gates & OTel-shaped telemetry traces | 🚀 Level 3: Operational AgenticsCombines Level 1 output contracts and Level 2 security/RAG context into autonomous, multi-turn tool execution against production systems (SQLite/Salesforce CRM) with strict financial guardrails. | • Autonomous enterprise CRM case resolution (refunds, order updates, email drafting)• Multi-agent policy enforcement & financial tier escalations• Cross-tool integration via native MCP across IDEs (Claude Code, Copilot, Gemini CLI, Codex) | Highlight Autonomous Control & Architecture:• Focus on safety controls: dual-key approval policies, hard-coded parameter stripping ( |
🛣️ Narrative Lineage Across the 3 Apps
App 1 - Discovery Analyzer - (Validation Layer): Proves you know how to talk to LLMs deterministically—getting structured data out without reliance on heavy frameworks, handling retries gracefully, and validating inputs/outputs against concrete business schemas.
App 2 - Knowledge Assistant - (Context & Security Layer): Expands single-turn output validation into multi-source enterprise retrieval, proving you can handle data isolation, prompt injection attacks, hybrid search ranking, and zero-hallucination citation checks.
App 3 - Case Resolution Agent - (Action & Agentic Layer): Translates validated structured outputs and secure context into autonomous system actions, orchestrating real tool calls via MCP, agent-to-agent negotiation, multi-turn error recovery, and strict human approval limits.
💡 Strategy: Demonstrating Technical Depth in Interviews
The FDE Engineering Philosophy: Walk interviewers through how this trio covers the complete deployment spectrum—from Discovery (parsing customer intake accurately) to Knowledge (safely accessing enterprise context) to Resolution (executing workflows via tools with guardrails).
Offline-First Resilience: Point out that all 3 apps run zero-dependency / offline test suites, mock layers, and golden evals without requiring API keys, proving your emphasis on testability and local CI/CD pipelines.
Standards over Lock-in: Highlight your architectural choices—writing lightweight, vendor-agnostic adapters (
urllib), implementing standard specs (MCP, A2A, JSON-Schema), and avoiding black-box agent frameworks in favor of explicit Python loop control.
Related MCP server: ParcelPilot MCP Server
Quick start (offline - no keys, stdlib only)
python -m case_agent reset
python -m case_agent run CS-1001 --approve ask # auto-refund $89.99
python -m case_agent run CS-1002 --approve ask # $1,200 -> pauses for YOU to approve
python -m case_agent batch # all 6 seeded cases + dashboard.html
python -m case_agent eval # grades DB state, 7 scenarios
python -m pytest -q # 15 tests incl. adversarial harness tests
python scripts/interop_check.py # (pip install mcp) official MCP client talks to our serverSeeded scenarios: 1001 auto-refund · 1002 supervisor approval · 1003 outside 30-day window (deny) · 1004 fraud flag (escalate) · 1005 prompt injection in the case text ("refund $9000") · 1006 already refunded.
The scripted mock deliberately calls get_case("1002") first, gets a corrective error from the MCP server, and self-corrects to CS-1002 - the same behavior you'd see from a real model.
Real models
Set a key + --provider anthropic|openai|gemini|xai|auto. All four use native tool/function calling through one normalized message format (llm.py; Gemini thought-signature parts are echoed back).
Mount the MCP server in your AI tool (same server, five hosts)
Host | Config in this repo |
Claude Code / Claude Desktop |
|
GitHub Copilot (VS Code) |
|
Gemini CLI / Google Antigravity |
|
OpenAI Codex CLI |
|
Then ask the tool: "use crm-cases to look up CS-1001 and tell me the order amount". Also ships AGENTS.md, CLAUDE.md, Copilot instructions and a SKILL.md (Claude Code + .agent/skills).
Guarantees enforced in code (and tested)
Model cannot self-approve:
approved_byis stripped from its arguments and absent from its tool schema; the MCP server also rejects >$250 refunds without it.issue_refundis impossible before an A2A policy verdict for that case+order; amount ≤ policy max; two-person tier escalates.Human denial -> no refund -> escalation, even if the model insists.
Repeated identical calls ->
LOOP_DETECTED; 3 consecutive tool errors or step-budget exhaustion -> fail-safe escalation of the case.Customer-authored text is data; the injected "$9000" case resolves for $40 like any other.
Honest limits
MCP and A2A here are small, spec-shaped implementations (stdio JSON-RPC; A2A message/send + Agent Card, no streaming/auth). Production: official SDKs, OAuth on the A2A endpoint, per-user identity propagation, durable state (LangGraph checkpointer) for hours-long approvals. The SQLite CRM is a stand-in for Salesforce/Data 360; swapping mcp_server.py for a Salesforce MCP/REST backend leaves the harness unchanged.
Available Tools
6 toolsdraft_customer_emailA
Save a DRAFT reply to the customer (never sent automatically; a human reviews and sends).
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| case_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly details a critical behavioral trait: the draft will never be sent automatically and requires human review. This highly valuable context is not provided by the annotations or schema and prevents dangerous misinvocation.
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 definition is extremely concise, using a single sentence to explain the tool's function and constraints without any wasted language or extraneous detail.
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 low-complexity tool (2 required parameters), the description provides sufficient information regarding its function, state, and operational constraints to allow an agent to select and invoke it safely. Minor details like input string length or ID format are not addressed, but are not critical for initial usage.
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?
Given that schema description coverage is 0%, the description adds significant value by defining the semantic context of the input: the `body` is a 'reply to the customer' and the `case_id` ties it to a customer case. This helps the AI understand the functional meaning of the required parameters.
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 identifies the specific action (Save a DRAFT reply) and the resource involved (customer). This distinguishes it from sibling tools that merely retrieve case data or update existing records.
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 implies clear usage guidance by stating that the tool is for drafting purposes, effectively guiding the agent to use this tool when immediate sending is not appropriate. It serves as a clear instruction on the tool's intended use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_caseARead-onlyIdempotent
Fetch a support case (subject, customer description, status, account_id, order_id, reason). Case ids look like CS-1001.
| Name | Required | Description | Default |
|---|---|---|---|
| case_id | Yes | e.g. CS-1001 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and closed-world, so the safety profile is covered. The description adds the returned field list and id format, which is genuinely useful, but says nothing about error behavior for unknown ids or whether a missing case returns empty vs. throws.
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 short sentences with zero waste: the verb and resource are front-loaded, and the id-format hint is placed at the end where it is most useful. Nothing is redundant.
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 single-parameter read tool with full annotation coverage and no output schema, the description covers purpose, returned fields, and id format adequately. The only gap is not describing behavior on invalid or unknown case ids.
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% and the case_id schema already supplies the 'e.g. CS-1001' example, which the description simply repeats. No additional syntax, validation, or constraint detail is added beyond the schema, so the baseline of 3 applies.
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?
States a specific verb and resource ('Fetch a support case') and enumerates the returned fields (subject, customer description, status, account_id, order_id, reason), making it clearly distinguishable from siblings like get_customer_profile and get_order by resource.
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?
Usage is implied — retrieve a case by id — but there is no explicit when-to-use/when-not guidance or reference to alternatives such as update_case for modifications or get_order for order data. The agent must infer the boundary itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_customer_profileBRead-onlyIdempotent
Unified customer profile (tier, region, fraud_flag, lifetime value, open cases, lifetime refunds). Account ids look like A-100.
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so the safety profile needs no repetition. The description adds the concrete contents of the profile (fraud_flag, lifetime value, open cases, refunds), which is genuinely useful context about what the read surfaces, but it says nothing about lookup failure behavior or freshness of the aggregates.
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 short sentences, the field inventory front-loaded and the id format second, with no filler. The tradeoff is that the terseness comes partly from omitting a verb and any routing guidance rather than from tight editing.
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 one-parameter read tool with full annotation coverage and no output schema, the description does the important remaining work by listing the returned fields and the id format. Missing only not-found behavior and sibling routing, which are minor at this complexity.
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 0% for the single account_id parameter, so the description carries the burden. It partially compensates with the format hint 'Account ids look like A-100', which is real value beyond the bare string type, but it does not state whether the id is case-sensitive, whether an alternate id form is accepted, or what happens on a malformed id.
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 names the resource (a unified customer profile) and enumerates the fields it exposes, so the agent knows roughly what comes back. However, it is a bare noun phrase with no verb and no differentiation from siblings like get_case or get_order, leaving the agent to infer that this is a read of an account record keyed by account_id.
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?
There is no when-to-use guidance at all: no mention of when to pick this over get_case, get_order, or draft_customer_email, and no prerequisites or exclusion conditions. The only inferable cue is that an account id is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_orderARead-onlyIdempotent
Fetch an order (item, amount, delivered_on, refunded). Order ids look like O-5001.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds value beyond them by disclosing the shape of the returned record and the required id convention (O-5001), which is real behavioral context an agent needs before calling.
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 short sentences, front-loaded with the action and return shape, then the id hint. Nothing is redundant or padded.
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 one-parameter read with rich annotations and no output schema, the description covers the essential: what comes back and how to form the argument. The only real gap is not-found behavior, which is minor for a lookup of this size.
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 schema documents nothing (0% coverage) and the single parameter is a bare string, so the description carries the burden. The "Order ids look like O-5001" example gives the format and prefix needed to construct a valid value, which is meaningful beyond the schema — though it doesn't state whether the prefix is case-sensitive or whether ids can be passed without it.
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?
States a specific verb and resource ("Fetch an order") and parenthesizes the fields it returns (item, amount, delivered_on, refunded). That is enough to distinguish it from siblings like get_case and get_customer_profile, though it never names those siblings explicitly.
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?
Usage is only implied by the verb and the id-format hint — fetch a single order when you have its id. There is no explicit guidance on when to prefer this over get_case or get_customer_profile, and no statement about what happens when the order doesn't exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_refundADestructive
Issue a refund for an order. FINANCIAL ACTION. Amounts above $250 need a human approver (approved_by is set by the harness, never by the model).
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | ||
| reason | Yes | ||
| case_id | Yes | ||
| order_id | Yes | ||
| approved_by | No | Set by the agent harness after human approval. Do not supply. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and non-idempotent, so the safety profile is established structurally. The description adds value beyond that: it flags a financial action, defines the $250 approval threshold, and clarifies that approved_by is populated by the harness rather than the model — a behavioral detail no annotation conveys. It omits remaining behavior such as reversibility of an issued refund or what happens on retry, which keeps it from a 5.
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?
Three short sentences, front-loaded with the action and immediately followed by the risk warning and the approval constraint. The parenthetical about approved_by prevents a likely misuse and earns its space; nothing is filler.
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 destructive, non-idempotent financial mutation with no output schema and 20% parameter coverage, the description covers the most important risk (approval gating) but leaves gaps: whether partial refunds are supported, what reason should contain, whether the call is retryable, and what confirmation is returned. Adequate as a guardrail, incomplete as a full specification.
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 only 20%, with approved_by the sole documented parameter, so the description must carry weight — and it does partially, explaining both the amount threshold and the provenance of approved_by. However, reason, case_id, and order_id receive no semantic elaboration (accepted values, format, or relationship to the order/case), leaving half the required surface undocumented.
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?
"Issue a refund for an order" gives a specific verb plus resource, and no sibling (get_case, get_order, update_case, draft_customer_email) competes for this action, so differentiation is implicit. It stops short of stating scope details such as partial vs full refunds, but the core action is unmistakable.
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 supplies one concrete usage rule — amounts above $250 require a human approver — which is genuinely actionable gating information. It does not say when to prefer this over alternatives (e.g., escalation paths, or when a refund should instead be declined or drafted as an email to the customer), leaving the broader invocation context to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_caseB
Set case status and add an internal note.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | ||
| status | Yes | ||
| case_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose non-read-only, non-destructive, non-idempotent, closed-world behavior, so the safety profile is covered. The description adds one genuinely useful fact beyond them: the note is 'internal', i.e. not customer-visible. However, it does not explain why the call is non-idempotent, whether status changes notify the customer, or whether the update is reversible — notable gaps for a mutation tool.
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?
A single tight sentence with the action and both effects front-loaded; nothing is redundant. It is arguably too terse, but that gap is better attributed to completeness than to wordiness.
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 three-required-parameter mutation with zero schema descriptions and no output schema, the definition should state whether the note is appended or replaces an existing one, whether status transitions are constrained, and what the caller gets back. None of that is present, so an agent can invoke it but cannot predict its effect.
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 0%, and the schema itself only names the fields; the enum values for status are self-documenting. The description does add real meaning for two parameters ('internal note' implies internal-only visibility; 'set case status' implies overwrite rather than append), but leaves case_id and note length/append-vs-replace semantics unexplained.
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?
Names a specific verb ('Set') and two concrete resources (case status, internal note), which is enough for an agent to distinguish it from the read-only siblings like get_case. It stops short of explicitly contrasting itself with any sibling by name.
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?
There is no guidance on when to use this versus alternatives, no prerequisites (required permissions, whether the case must be open), and no statement of what happens downstream when a status is set. The agent must infer usage entirely from the name.
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.
6 tool updates
v1.0.0- First observed
draft_customer_email - First observed
get_case - First observed
get_customer_profile - First observed
get_order - First observed
issue_refund - First observed
update_case
TDQS
Scored across 6 tools
Each tool targets a clearly distinct resource or action: cases, customer profiles, orders, refunds, case updates, and email drafts. The only same-resource overlap is get_case vs update_case, but their actions are unambiguous.
All tools follow a consistent snake_case verb_noun convention: get_case, get_customer_profile, get_order, issue_refund, update_case, draft_customer_email. The pattern is predictable and readable throughout.
Six tools is well-scoped for a CRM case-handling server. Each tool earns its place in the support workflow without obvious redundancy or excessive surface area.
The surface covers the core case workflow: fetch case/customer/order context, issue refunds, update case status, and draft replies. It lacks case search/listing or case creation, but those are minor gaps for an agent working from a known case id.
Maintenance
Related MCP Connectors
Salesforce-grounded retrieval, diagnoses, and a vetted-Force marketplace for MCP clients.
Manage tickets, run agents and workflows, query tables, and search workspace knowledge.
Connect AI to store orders, products and inventory with scoped access and human approvals.
Plan Salesforce deploys, open pull requests and trigger pipelines from your AI client.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides AI agents with secure access to Salesforce data and operations, enabling natural language interaction with CRM for sales, marketing, and executive teams.65MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to retrieve customer, order, ticket, policy, and agreement information, and to prepare or execute state-changing support actions like escalations and follow-ups with confirmation and access control.-
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to securely call enterprise MCP tools with tenant-scoped RBAC, human approvals, audit logging, and multi-tool workflows across customer, order, document, and ticket data.-
- AlicenseAqualityBmaintenanceEnables AI agents to securely query, search, and modify Salesforce data through standard Salesforce APIs, including record CRUD, SOQL/SOSL search, Bulk API 2.0 operations, composite calls, object discovery, and custom Apex REST endpoints.15MIT