A fresh image build pulled mcp 2.0.0, which removed mcp.server.fastmcp and
crash-looped the container (ModuleNotFoundError). Pin to the 1.x line the
server is written against; the 2.x migration is a deliberate change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
plugin/make-plugin.{sh,ps1} stamp a user's own Freshservice API key and the
shared server token into a template and emit a personalized freshservice.plugin
(direct HTTP MCP connection — no Node/mcp-remote/config editing on clients).
Built plugins embed credentials, so *.plugin is git-ignored; the committed
template holds only placeholders. Validated with 'claude plugin validate'.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add multi-user auth: _config reads X-Freshservice-Domain/X-Freshservice-Key
from the per-request headers (via the SDK request_ctx, set inside the tool's
task) and prefers them over the container env. One shared server can now act as
each caller's own Freshservice identity — actions attributed to them, their
permissions, their rate limit — while the env vars remain a single-user
fallback. Verified end-to-end that concurrent clients don't cross-wire and that
a client with no creds errors instead of falling back silently.
Docs/.env.example updated with the multi-user client config and the guidance to
omit env FS creds on a shared deployment.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The committed desktop/CLI skill package predated the reference.md custom-status
guidance and the fs.py request timeout. Rebuild it from the current skill files.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- _status_choices no longer caches failures: a transient /ticket_form_fields
error used to cache [] forever, silently degrading unresolved=True to an
unfiltered listing (including Resolved/Closed) until container restart.
unresolved=True and list_ticket_statuses now return an explicit error when
the status list can't be fetched instead of degrading silently.
- All API calls (server and skill helper) now use a 30s timeout with a clean
error, so a hung connection can't block a tool call indefinitely.
- _coerce_status falls back to the instance's live status list, so custom
names like "Working" coerce to their id instead of 400ing at the API.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The pesco instance defines 13 ticket statuses, not the 4 defaults, so a
(status:2 OR status:3) 'open tickets' filter silently dropped Working,
Scheduled, Waiting*, Pending Approval, etc. — undercounting 24 open tickets as 1.
Add a status helper that reads the status field from /ticket_form_fields and
treats only ids 4/5 (and closed/resolved-labelled) as terminal. Expose
list_ticket_statuses() and a list_tickets(unresolved=True) shortcut that builds
the full non-terminal status clause automatically. Document the gotcha in the
skill reference.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
list_tickets struggled to express 'assigned to me and not resolved/closed'.
Document that assignee filtering uses the numeric agent_id (resolve from email
via list_agents first) and that open statuses must be enumerated as
(status:2 OR status:3) since there's no negation. Add workspace_id passthrough
for multi-workspace accounts. Mirror the guidance in the skill reference.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The streamable-HTTP transport enables DNS-rebinding protection by default,
which rejects non-localhost Host headers with HTTP 421. The server is reached
by LAN IP via mcp-remote (not a browser) and is gated by a bearer token, so
disable the protection via TransportSecuritySettings.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Cowork runs the agent in an isolated VM, so the uploaded skill can't see host
credentials or reach the Freshservice host. Add an HTTP/streamable MCP server
(bearer-auth, Dockerfile, compose) to run as a container on the LAN box and
connect via mcp-remote like the existing sharepoint-lists server. The skill
remains the right tool for the non-sandboxed Claude Code CLI.
Also gitignore mcp-server/.env and include the desktop skill install package.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Stdlib-only fs.py helper wrapping the Freshservice REST API v2 (auth, URL
building, filter quoting, pagination, error surfacing), plus SKILL.md and a
reference of endpoints, status/priority codes, and filter-query syntax.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>