MCP server for 104.com.tw job search platform
Kafka is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
Open InstallationWhat it does
MCP tools for Apache Kafka on Heroku: cluster info, topics, and consumer groups.
Quickstart
# 1 — run it from where its publisher ships it
npx -y @heroku-mcp/kafka
# 2 — the plan is chosen at checkout, in the browser
# 3 — ask your agent something
> MCP tools for Apache Kafka on Heroku: cluster info, topics, and consumer groups.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Kafka as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. It is scanned, signed and pinned to the version you choose — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. Claude Code registers it in one command.
claude mcp add kafka-mcp -- npx -y @heroku-mcp/kafkaReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
99 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List Heroku apps the authenticated user has direct access to (personal + explicit collaborator), paginated. For the full union across every team use apps_list_all; for a single team use team_apps_list. Wraps GET /apps.
Takes no parameters.
Return the union of every Heroku app the authenticated user can access — personal apps, collaborator apps, AND apps owned by every team the user belongs to. Equivalent to
Takes no parameters.
List apps owned by the authenticated user (excludes apps the user has access to but doesn
Takes no parameters.
Return one app by id or name. Wraps GET /apps/{id_or_name}.
Takes no parameters.
Return multiple apps in one call, filtered by id. Wraps POST /filters/apps. This is a read filter despite the POST verb — body is a query, not a mutation.
Takes no parameters.
List feature flags on an app. Wraps GET /apps/{id_or_name}/features.
Takes no parameters.
Return one app feature flag. Wraps GET /apps/{id_or_name}/features/{feature}.
Takes no parameters.
Return the current config vars for an app. Values are returned in cleartext per Heroku — this tool intentionally bypasses redaction so callers can read their own secrets. Wraps GET /apps/{id_or_name}/config-vars.
Takes no parameters.
Return the config vars as they were at a specific release. Values are returned in cleartext per Heroku — this tool intentionally bypasses redaction so callers can read their own secrets. Wraps GET /apps/{id_or_name}/releases/{release}/config-vars.
Takes no parameters.
List an app
Takes no parameters.
Return one process type formation. Wraps GET /apps/{id_or_name}/formation/{type}.
Takes no parameters.
List the dyno sizes Heroku exposes. Wraps GET /dyno-sizes.
Takes no parameters.
List running dynos for an app. Wraps GET /apps/{id_or_name}/dynos.
Takes no parameters.
Return one dyno by id or name. Wraps GET /apps/{id_or_name}/dynos/{id_or_name}.
Takes no parameters.
List releases on an app. Wraps GET /apps/{id_or_name}/releases.
Takes no parameters.
Return one release by id or version. Wraps GET /apps/{id_or_name}/releases/{id_or_version}.
Takes no parameters.
List builds on an app. Wraps GET /apps/{id_or_name}/builds.
Takes no parameters.
Return one build. Wraps GET /apps/{id_or_name}/builds/{id}.
Takes no parameters.
List an app
Takes no parameters.
Return one slug. Wraps GET /apps/{id_or_name}/slugs/{id}.
Takes no parameters.
List custom domains on an app. Wraps GET /apps/{id_or_name}/domains.
Takes no parameters.
Return one custom domain by id or hostname. Wraps GET /apps/{id_or_name}/domains/{id_or_hostname}.
Takes no parameters.
List SNI endpoints on an app. Wraps GET /apps/{id_or_name}/sni-endpoints.
Takes no parameters.
Return one SNI endpoint. Wraps GET /apps/{id_or_name}/sni-endpoints/{id_or_name}.
Takes no parameters.
List log drains on an app. Wraps GET /apps/{id_or_name}/log-drains.
Takes no parameters.
Return one log drain by id, URL, or token. Wraps GET /apps/{id_or_name}/log-drains/{id_or_url_or_token}.
Takes no parameters.
List telemetry drains visible to the caller. Wraps GET /telemetry-drains. Note: Heroku scopes telemetry drains globally rather than per-app, hence no
Takes no parameters.
List webhooks on an app. Wraps GET /apps/{id_or_name}/webhooks.
Takes no parameters.
Return one app webhook. Wraps GET /apps/{id_or_name}/webhooks/{id}.
Takes no parameters.
List webhook deliveries for an app. Wraps GET /apps/{id_or_name}/webhook-deliveries.
Takes no parameters.
Return one webhook delivery. Wraps GET /apps/{id_or_name}/webhook-deliveries/{id}.
Takes no parameters.
List webhook events for an app. Wraps GET /apps/{id_or_name}/webhook-events.
Takes no parameters.
Return one webhook event. Wraps GET /apps/{id_or_name}/webhook-events/{id}.
Takes no parameters.
List collaborators on an app. Wraps GET /apps/{id_or_name}/collaborators.
Takes no parameters.
Return one collaborator by id or email. Wraps GET /apps/{id_or_name}/collaborators/{id_or_email}.
Takes no parameters.
List pending app transfers on the account. Wraps GET /account/app-transfers.
Takes no parameters.
Return one app transfer by id or app name. Wraps GET /account/app-transfers/{id_or_name}.
Takes no parameters.
Update a team. Wraps PATCH /teams/{id_or_name}.
Takes no parameters.
Delete a standalone (non-enterprise) team. Apps owned by the team survive under their original creators but lose team membership; enterprise-owned teams must be deleted via the enterprise account, not this tool. Wraps DELETE /teams/{id}. Destructive: pass confirm matching the team name.
Takes no parameters.
Add or update a member of a team (PUT semantics: creates if absent, updates if present). Wraps PUT /teams/{id_or_name}/members.
Takes no parameters.
Remove a member from a team. Wraps DELETE /teams/{id_or_name}/members/{email_or_id}. Destructive: pass confirm matching the member email.
Takes no parameters.
Create a new app owned by a team. Wraps POST /teams/apps. Pass
Takes no parameters.
Lock or unlock a team-owned app. When locked, only team admins can modify the app. Wraps PATCH /teams/apps/{id_or_name} with the
Takes no parameters.
Transfer ownership of a team-owned app to a different team or user. Wraps PATCH /teams/apps/{id_or_name} with the
Takes no parameters.
Add a collaborator to a team-owned app. Wraps POST /teams/apps/{id_or_name}/collaborators.
Takes no parameters.
Update a team-app collaborator
Takes no parameters.
Remove a collaborator from a team-owned app. Wraps DELETE /teams/apps/{id_or_name}/collaborators/{email}. Destructive: pass confirm matching the collaborator email.
Takes no parameters.
Invite a user to a team (PUT semantics — re-issuing for the same email updates the role on the pending invite). Wraps PUT /teams/{id_or_name}/invitations.
Takes no parameters.
Accept a pending team invitation using its opaque token. Wraps POST /teams/invitations/{token}/accept.
Takes no parameters.
Revoke a pending team invitation. Wraps DELETE /teams/{id_or_name}/invitations/{user}. Destructive: pass confirm matching the invited email. There is no individual GET for invitations — the dry-run pre-fetch lists invitations and filters by email.
Takes no parameters.
Toggle a team feature flag. Wraps PATCH /teams/{id_or_name}/features/{id_or_name}.
Takes no parameters.
Update team preferences (whitelisting-enabled, addons-controls, etc.). Pass only the keys you want to change. Wraps PATCH /teams/{id_or_name}/preferences.
Takes no parameters.
Allow a specific add-on service for a team. Wraps POST /teams/{id_or_name}/allowed-addon-services.
Takes no parameters.
Remove an allowed add-on service from a team. Wraps DELETE /teams/{id_or_name}/allowed-addon-services/{id_or_name}. Destructive: pass confirm matching the service name. There is no individual GET — the dry-run pre-fetch lists allowed services and filters by name.
Takes no parameters.
Update the authenticated Heroku account. Wraps PATCH /account. To delete the account itself, use the Heroku Dashboard — account deletion is intentionally not exposed by this MCP.
Takes no parameters.
Toggle an account feature flag. Wraps PATCH /account/features/{id_or_name}.
Takes no parameters.
Recover the SMS number used for 2FA on the account. The phone number is stripped from the response. Wraps POST /account/sms-number/actions/recover.
Takes no parameters.
Upload an SSH public key to the authenticated account. Wraps POST /account/keys. Heroku has been gradually deprecating SSH-key-based deploys, but the endpoint works for users who still rely on it.
Takes no parameters.
Remove an SSH key from the authenticated account. Wraps DELETE /account/keys/{id_or_fingerprint}. Destructive: pass confirm matching the key fingerprint.
Takes no parameters.
Create a new OAuth authorization (and underlying access token) on the authenticated account. Wraps POST /oauth/authorizations. The returned token is a real credential — handle carefully.
Takes no parameters.
Revoke an OAuth authorization. Wraps DELETE /oauth/authorizations/{id}. Destructive: pass confirm matching the authorization id or its description.
Takes no parameters.
Regenerate the access/refresh tokens for an OAuth authorization. Old tokens stop working immediately. Wraps POST /oauth/authorizations/{id}/actions/regenerate-tokens. Destructive: pass confirm matching the authorization id.
Takes no parameters.
Update the invoice billing address on the authenticated account. Wraps PUT /account/invoice-address.
Takes no parameters.
Apply a credit code to the authenticated account. Wraps POST /account/credits.
Takes no parameters.
Update the authenticated user preferences (timezone, default region, etc.). Pass-through: only the keys you supply are updated. Wraps PATCH /users/~/preferences.
Takes no parameters.
List all add-ons the authenticated user has access to (across apps). Paginated. Wraps GET /addons.
Takes no parameters.
Return one add-on by id or name. The add-on name has the form
Takes no parameters.
Resolve an add-on by name across all apps the user has access to. Wraps POST /actions/addons/resolve. Semantically a read: the body is a search filter, not a mutation. Useful when the user knows the add-on name (e.g.
Takes no parameters.
List add-on services available in the Heroku Elements marketplace. Paginated. Wraps GET /addon-services.
Takes no parameters.
Return one add-on service by id or name. Wraps GET /addon-services/{id_or_name}.
Takes no parameters.
List the regions and capabilities for an add-on service. Wraps GET /addon-services/{id_or_name}/region-capabilities.
Takes no parameters.
List the plans offered by an add-on service. Paginated. Wraps GET /addon-services/{id_or_name}/plans.
Takes no parameters.
Return one plan record. Wraps GET /addon-services/{service}/plans/{id_or_name}.
Takes no parameters.
List all add-on attachments visible to the caller. Paginated. Wraps GET /addon-attachments.
Takes no parameters.
Return one add-on attachment by id. Wraps GET /addon-attachments/{id}.
Takes no parameters.
Resolve an add-on attachment by name across apps. Wraps POST /actions/addon-attachments/resolve. Semantically a read.
Takes no parameters.
Return the configuration the add-on service has set on the parent app via Heroku. Cleartext values; not redacted. Wraps GET /addons/{id_or_name}/config.
Takes no parameters.
List the custom actions published by an add-on service. Not every service publishes actions; an empty list (or 404) is normal. Wraps GET /addon-services/{id_or_name}/actions.
Takes no parameters.
List webhook subscriptions on an add-on. Paginated. Wraps GET /addons/{id_or_name}/webhooks.
Takes no parameters.
Return one add-on webhook by id. Wraps GET /addons/{id_or_name}/webhooks/{id}.
Takes no parameters.
Generate a one-time SSO URL the user can open in a browser to authenticate against the add-on partner
Takes no parameters.
Create a new app. All fields are optional — Heroku generates a name when omitted. Wraps POST /apps.
Takes no parameters.
Update an app. Patches name, maintenance mode, or build_stack. Optimistic concurrency: pass expected_etag to require that the server-side ETag matches before applying the change. Wraps PATCH /apps/{id_or_name}.
Takes no parameters.
Destroy an app. Irreversible: all dynos, add-ons, config vars, and releases are removed. Wraps DELETE /apps/{id_or_name}. Destructive: pass confirm matching the app name.
Takes no parameters.
Enable Automated Certificate Management on an app. Wraps POST /apps/{id_or_name}/acm.
Takes no parameters.
Disable Automated Certificate Management on an app. Wraps DELETE /apps/{id_or_name}/acm. Destructive: pass confirm matching the app name.
Takes no parameters.
Refresh Automated Certificate Management on an app (re-issues certificates). Wraps PATCH /apps/{id_or_name}/acm.
Takes no parameters.
Update or delete config vars on an app. Pass null as a value to delete a key. Heroku triggers a new release on success. The response returns the full config-var key set with values masked — use config_vars_get to read values. Wraps PATCH /apps/{id_or_name}/config-vars.
Takes no parameters.
Toggle a feature flag on an app. Wraps PATCH /apps/{id_or_name}/features/{feature}.
Takes no parameters.
List enterprise accounts the authenticated user has access to. Paginated. Wraps GET /enterprise-accounts.
Takes no parameters.
Return one enterprise account by id or name. Wraps GET /enterprise-accounts/{id_or_name}.
Takes no parameters.
Return a daily usage breakdown for an enterprise account across a date window. Wraps GET /enterprise-accounts/{id_or_name}/usage/daily.
Takes no parameters.
Return a monthly usage breakdown for an enterprise account across a date window. Wraps GET /enterprise-accounts/{id_or_name}/usage/monthly.
Takes no parameters.
List members of an enterprise account. Paginated. Wraps GET /enterprise-accounts/{id_or_name}/members.
Takes no parameters.
List apps a specific enterprise account member has access to. Wraps GET /enterprise-accounts/{id_or_name}/members/{user_email_or_id}/apps. Returns 404 if the member is not found.
Takes no parameters.
List the permission entities defined on an enterprise account. Paginated. Wraps GET /enterprise-accounts/{id_or_name}/permissions.
Takes no parameters.
List add-ons attached to apps across all teams owned by an enterprise account. Paginated. Wraps GET /enterprise-accounts/{id_or_name}/addons. The endpoint may not be exposed on every enterprise plan — Heroku returns 404 if the rollup is not available.
Takes no parameters.
List teams owned by an enterprise account. Paginated. Wraps GET /enterprise-accounts/{id_or_name}/teams. Enterprise-owned teams are the recommended Heroku organisational unit (the deprecated standalone teams API still works via the
Takes no parameters.
Return the credit pool record for an enterprise account, if exposed on this plan. Wraps GET /enterprise-accounts/{id_or_name}/credit-pool. Heroku returns 404 when the credit-pool resource is not enabled — the tool surfaces that as a not_found envelope rather than throwing.
Takes no parameters.
- 12,000 calls a month, included
- 144 calls a minute at peak
- Every tool the listing has
- Cancel any time — the unused days are credited
- Runs behind the gateway, so cancelling stops it
- 100,000 calls a month, included
- 1,200 calls a minute at peak
- Every tool the listing has
- Cancel any time — the unused days are credited
- Runs behind the gateway, so cancelling stops it
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
No call is billed on its own, and this plan carries no monthly call limit. $15 a month covers every tool at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | minimal | capability blast radius (minimal) — client exposure if the model is manipulated | −0 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (5 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. minimal is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| kafka_consumer_groups_list | no tags | |
| kafka_list | no tags | |
| kafka_info | no tags | |
| kafka_topics_list | no tags | |
| kafka_topics_info | no tags |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
The public result for this release does not print the flow graph, so there is nothing to show here. That is not the same as "no paths were found": what the scan did read is above, under coverage.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Pinned to 1.0.1 — the install command below asks for that release. A pin is part of an install, so it is kept for this visit and written down when you install.
No release note was published with this version.
Only accounts with at least 50 real tool calls against this server in the last 90 days can post. Ratings are weighted by how much the reviewer actually uses it, and publishers can reply once per review.
Writing one takes an account with at least 50 real tool calls against Kafka in the last 90 days. That is the whole gate — there is no other way to post, which is why the counts beside each review are worth reading.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes an account with 50 real tool calls against it.