semblekit
MCP server for the Semble practice-management API, enabling AI agents to search for patients, contacts, and users, as well as retrieve patient relationships via read-only tools.
README
semblekit (@burrows99/semblekit)
CLI, library & MCP server for the Semble practice-management API — usable by any agent, human, or script.
semblekit drives Semble over its public GraphQL API. It models Semble's own
concepts (contacts, patients & relationships, users) rather than any one organisation's usage of them, and
ships four ways to use it: a semble CLI, an importable library, an MCP server, and a Claude Code plugin.
Not affiliated with, endorsed by, or supported by Semble Ltd. "Semble" names the API this tool interoperates with.
Design principle. Commands map to Semble resources, not workflows. A "Responsible Clinician", for example, is not a first-class Semble thing — it is just a patient relationship with a label pointing at a contact. So the tool exposes
semble patient relationship …and leaves the meaning to the consumer.
Naming. The repo and CLI command are
semblekit/semble; the published package is@burrows99/semblekiton the GitHub Packages registry (the bare namesemblekitis taken on npmjs). The Claude plugin issemble@semblekit.
Table of Contents
Security
Semble is a practice-management / EHR system, so treat everything it returns as sensitive.
- De-identification (on by default). Output is pseudonymised before any agent, CLI, or MCP client sees
it: direct identifiers — name, email, date of birth, phone, address, NHS number — are redacted, and
free-text is scrubbed for embedded emails / phone / NHS numbers, while Semble's opaque ids and clinical
values are kept. Per the ICO,
pseudonymised data is still personal data — this reduces what agents read, it does not anonymise.
Disable with the CLI
--no-deidflag orSEMBLE_DEID=false(honoured by the CLI and the MCP server; for MCP it is set at launch, so an agent cannot turn it off itself). - Health data.
patientdata is likely special-category personal data under UK GDPR / the Data Protection Act. You remain the controller or processor for anything you move with this tool. Prefer the sandbox for development. - Credentials. Supplied via flags, environment variables, or
~/.config/semble/config.json— never hardcoded. Keep them out of version control; the tool never logs credential values. - Tracing & data on disk. Every command appends request metadata (no bodies) to
.semble/trace.jsonl.--trace/--trace-fulladditionally persist full request and response bodies — which may contain patient data — to that file. Secrets (tokens) are redacted, patient data is not..semble/is git-ignored by default; avoid full tracing against production data unless your obligations allow it.
Background
Credentials and API URLs come from flags, environment variables, or a config file — never hardcoded — so
semblekit is not coupled to any deployment. It runs on plain Node (built-in fetch, Node ≥ 18); no Docker.
It talks to Semble's public GraphQL API (x-token). The design is object-oriented: typed entities own
their behaviour, thin resources do I/O, and a single fetch chokepoint makes request tracing a one-line wrap.
Install
Requires Node ≥ 18. semblekit is published to the GitHub Packages npm registry, which needs a
one-time scope + token setup (a GitHub token with the read:packages scope):
printf '@burrows99:registry=https://npm.pkg.github.com\n//npm.pkg.github.com/:_authToken=YOUR_GITHUB_TOKEN\n' >> ~/.npmrc
npm install -g @burrows99/semblekit # global: the `semble` CLI + `semble-mcp` MCP server
# or, as a library in a project:
npm install @burrows99/semblekit
Dependencies
Node ≥ 18 only (uses the built-in fetch). No Docker, no database.
Usage
Credentials resolve flags > environment > config file > built-in presets, and are auto-discovered from
the nearest .env / .claude/.env walking up from the working directory. See .env.example.
For the public API the relevant variables are SEMBLE_OPEN_URL and SEMBLE_TOKEN.
CLI
semble patient search "smith" --limit 5 # find a patient id
semble patient get <patientId> --json
semble contact search "clinic" --json # find a contact/clinician id
semble user list
semble patient relationship add <patientId> <contactId> --label "Responsible Clinician"
semble help
--json for machine output, --trace for a DevTools-style request log, --limit to cap paginated results.
stdout is data, stderr is messages; exit 0 success · 1 runtime error · 2 usage error.
Library
import { SembleClient, SembleTracer, loadConfig } from "@burrows99/semblekit";
const client = new SembleClient(loadConfig({ profile: "sandbox" }));
const [patient] = await client.patients.search("smith");
const rels = await client.patients.listRelationships(patient.id);
new SembleTracer(client, (record) => console.error(record)); // optional: trace every HTTP exchange
Methods return data or throw SembleError; they never call process.exit or print. search / list
paginate automatically and accept { limit }.
MCP server
semblekit ships a stdio MCP server so an AI host can drive Semble as
tools — run it with npx, no install needed (uses the .npmrc set up in Install):
npx -p @burrows99/semblekit semble-mcp
Point an MCP host at it:
{
"mcpServers": {
"semblekit": { "command": "npx", "args": ["-y", "-p", "@burrows99/semblekit", "semble-mcp"] }
}
}
Inspect it with the MCP Inspector:
npx @modelcontextprotocol/inspector npx -p @burrows99/semblekit semble-mcp
Read-only tools: semble_patient_search, semble_patient_get, semble_patient_relationships,
semble_contact_search, semble_contact_get, semble_user_list, semble_user_get.
Claude Code plugin
claude plugin marketplace add /path/to/semblekit
claude plugin install semble@semblekit
API
new SembleClient(config?)— composes the transport and resources; buildconfigwithloadConfig(options).client.patients—search(query?, { limit? }),get(id),listRelationships(patientId).client.contacts—search(query?, { limit? }),get(id).client.users—list({ limit? }),get(id).SembleTracer(client, sink, options?)— decorates the client's fetch chokepoint;sink(record)fires per request, with secrets redacted.SembleConfig/loadConfig/PRESETS— profile resolution; presets namesandboxandprod.- Entities —
Patient,Contact,User,RelatedAccount; eachJSON.stringifys to its API shape. - Errors —
SembleErrorand its subclassesSembleConfigError,SembleAuthError,SembleApiError,SembleNotFoundError,SembleValidationError.
Maintainers
@burrows99 (Raunak Burrows).
Contributing
Questions and bugs: open an issue at github.com/burrows99/semblekit/issues.
PRs are welcome and target main. Keep org-specific meaning out of the library — expose the generic Semble
operation.
npm install # installs deps, builds via `prepare`
npm run build # tsc → dist/ + .d.ts
npm run typecheck # tsc --noEmit
npm test # placeholder suite
Source is TypeScript (ESM, NodeNext) in src/**/*.ts, compiled to dist/. Add a resource by creating its
entity in src/entities/, a src/resources/<resource>.ts, wiring it onto the client in src/client.ts,
and a matching src/commands/<resource>.ts.
License
MIT © Raunak Burrows.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.