{"name":"io.github.markusvankempen/mcp-ticket-demo","slug":"markusvankempen-mcp-ticket-demo","title":null,"description":"MCP server demo — tickets, schema discovery, auth, and PII gating. stdio + HTTP.","url":"https://mcp.market/server/markusvankempen-mcp-ticket-demo","rating":null,"grade":"B","score":83,"certified":false,"status":"active","category":"security","tags":["security"],"presence":{"score":30,"stars":1,"forks":0,"downloads_week":313,"last_push_at":"2026-10-02T01:12:32.000Z","license":"NOASSERTION"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/markusvankempen/mcp-ticket-demo","website":null,"version":"1.9.0","remotes":[],"packages":[{"registryType":"npm","identifier":"mcp-ticket-demo","version":"1.9.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"API key for authenticated tool calls. Issue one on /admin → API Keys. Required when AUTH_MODE=write or AUTH_MODE=all.","format":"string","isSecret":true,"name":"MCP_API_KEY"},{"description":"Authentication mode: off (default), write (write+pii tools gated), all (every tool gated).","format":"string","name":"AUTH_MODE"},{"description":"Extra username/password users: 'alice:secret:read,write'. Comma-separated, colon-delimited.","format":"string","isSecret":true,"name":"MCP_USERS"},{"description":"Max tool calls per window per caller. Default 60.","format":"string","name":"RATE_LIMIT"}]}],"tools":[{"name":"add_comment","description":"Add a comment to an existing ticket. You need a real ticket_id from search_tickets or get_ticket — do not invent TCK- ids. Pass author as the human speaking; omitting it attributes the comment to the service account. This is a write tool and may require a credential. To resolve the ticket after commenting, call close_ticket.","write_action":false,"price_micros":0,"input_schema":null},{"name":"close_ticket","description":"Resolve and close a support ticket (destructive, idempotent). Sets status to solved and records resolved_at. Optionally appends resolution as the final comment. If the ticket is already solved this is a no-op and returns alreadyClosed=true — do not retry. Use a real ticket_id from search_tickets or get_ticket. Use add_comment first if you want a longer explanation before closing. This is a write t","write_action":false,"price_micros":0,"input_schema":null},{"name":"create_ticket","description":"Open a support ticket on behalf of a customer. ALWAYS pass requester_email as the real customer email. If you omit it the call still succeeds (201) but the service account owns the ticket and every reply is mailed to the bot, not the customer — that is the attribution scar. A tool is not done when the API call succeeds; it is done when the next thing that happens is right. This is a write tool and","write_action":true,"price_micros":0,"input_schema":null},{"name":"describe_server","description":"Call this first, and again after any denial or empty tool list: server identity, auth mode, who the server thinks you are, the scopes you hold, your rate-limit budget, and every tool with the scope it needs and whether it is currently available. Discovery stays open in every auth mode. When a call was denied, this tells you which credential is missing — do not guess.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_schema","description":"Return fields and filterable keys for one schema. Call after list_schemas and before run_query so you know which filter keys are valid. name must be tickets, customers, or assets.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_ticket","description":"Fetch one ticket by id, including comments and attribution (customer vs service_account). Use when you already have a ticket_id like TCK-1001. If you do not have an id, call search_tickets first — a missing id is not a reason to invent one. Same data is also at ticket://TCK-1001.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_schemas","description":"List the queryable schemas on this server (tickets, customers, assets). Call this BEFORE run_query. There is no query_tickets, query_assets, or query_with_filter tool — discover the shape here, then get_schema, then run_query. Same list is also at schema://{name} after resources/list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"lookup_customer","description":"Look up one customer by email (plan, region, contact). Use this for customer records, not tickets — tickets use search_tickets. Phone is PII: it stays REDACTED unless the caller presents a credential with the pii scope. Known demo emails: ada@example.com, sam@example.com. Do not invent other addresses and retry.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_query","description":"Run one exact-match query against a schema from list_schemas. Pass schema plus optional filter (keys from get_schema.filterable) and fields. This is the only query tool — do not invent query_tickets, query_assets, or query_with_filter. Empty rows mean no match; loosen the filter, do not retry the identical query.","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_tickets","description":"Find support tickets by status, requester email, or a keyword in subject/body. Use this when someone asks to list, find, or search tickets. Default status is open — an empty list means no match for those filters, not that the server is empty; broaden to status=all or drop requester_email. Do not retry the same filters. To fetch one known id use get_ticket or read ticket://TCK-1001. Do not invent q","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":83,"grade":"B","scanned_at":"2026-10-03T05:45:44.411Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-10-03T05:45:44.366Z","components":{"code":{"score":25,"max":25,"notes":["12 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":15,"max":15,"notes":["last push 1 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"mcp-ticket-demo","version":"1.9.0","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-24T15:15:15.488Z","repositoryUrl":"git+https://github.com/markusvankempen/mcp-ticket-demo.git","weeklyDownloads":313}],"repo":{"found":true,"owner":"markusvankempen","repo":"mcp-ticket-demo","archived":false,"pushedAt":"2026-10-02T01:12:32Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/8257509?v=4","ownerCreatedAt":"2014-07-24T13:40:14Z","license":"NOASSERTION"},"icon":{"url":"https://avatars.githubusercontent.com/u/8257509?v=4&s=128","source":"registry"},"presence":{"stars":1,"forks":0,"downloadsWeek":313,"license":"NOASSERTION","lastPushAt":"2026-10-02T01:12:32.000Z","score":30}}}},"grade_history":[],"reviews":[]}