Licensing Hardening MCP Server
Click on "Install 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., "@Licensing Hardening MCP Servershow me the last inspection for licence 9003"
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.
Harden the local-authority licensing assistant's MCP server
Local authority — licensing team. The assistant answers questions about taxi and premises licences — "is licence 9003 active, and what did the last inspection say?" — so officers don't dig through the case system by hand. This MCP server is how it reaches the licensing database. A colleague "improved" it before they left; it works, it demos cleanly, and it carries every native MCP weakness from this afternoon. Work through it on your own.
Get it running
Plain Python — no Docker, no Git.
pip install -r requirements.txt
python seed.py # builds licensing.db (includes a planted inspection note)See the attacks land before you fix anything:
python exploit.py # SQL injection + over-exposure of home addresses / DBS status
python poisoning_demo.py # a tool whose DESCRIPTION carries hidden instructionsRelated MCP server: Vulnerable MCP Server
Your task
Harden server.py so the native attacks fail while legitimate use still works.
Work through them in this order:
Result injection —
read_inspection_notehands raw note text back to the model. Return it labelled as untrusted data, and rely on a system-prompt rule that labelled data is content, never command. (Licensee 3's note is an instruction to suspend a licence — the note-reader andsuspend_licence, each harmless, compose into a suspension.)Tool poisoning —
format_reference's description contains hidden instructions. Review every description; a server you do not trust should not reach the model's context. Neutralise it.Confused deputy —
suspend_licenceis state-changing and unscoped. Put it behind a scope check, and reject any bearer token whoseaudis not this server (the Week 5 discipline).Inherited — parameterise
find_licenseeand return only the columns the assistant needs (neverhome_address,dbs_status, orinspection_notes).Audit — append every tool call to a log.
You are done when poisoning_demo.py finds nothing in your descriptions and
exploit.py's payloads are rejected, while a normal find_licensee("Aisha") still
returns a result.
Stretch
Add a real
audcheck: decode the presented token and refuse a foreign audience.With two servers connected to one host, how would a malicious second server reach this one's
suspend_licence? Write down the control that stops it.
Files
File | Contents |
| The vulnerable MCP server — the thing you harden. |
| Builds |
| Proves the inherited flaw (SQL injection + over-exposure). |
| Prints the model-facing descriptions; flags the poisoned one. |
|
|
Questions worth asking yourself
Which of your fixes are MCP-specific, and which are ordinary secure coding?
A description you did not write reached your model. Whose job is it to have caught that — the server author, the host, or the person who approved it?
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/iNileshW/mcp-licensing-hardening'
If you have feedback or need assistance with the MCP directory API, please join our Discord server