M
Mark Moore
Hey - Hermes agent can authenticate but it's basically useless since there's no way to toggle permissions for it on READ vs WRITE without having it basically brute force all the possible commands, which just creates a mess.
Hermes wanted me to paste this: From a third-party MCP client (Hermes Agent), almost every write endpoint returns HTTP 200 with a real-looking ID, but the record is never actually persisted (or persists with stripped string fields). Only create_tab and update_tab work. Same MCP works fine from Claude desktop on the same workspace, so the bug appears client- or User-Agent-specific.
Repro:
This works, name persists
create_tab canvas=workflows name="Hermes Test"
This returns id but list shows nothing
create_people people=[{first:"Test", last:"User"}] → list_people query=Test → 0 results
update on the returned id errors
create_process sections=[{name:"Test", steps:[{name:"S1"}]}] update_workflow sections=[{id:, name:"Renamed"}] → "Ecto.Repo.get/2 ... nil"
Affected (all return fake success or Ecto nil): create_process, create_org_structure, create_data_model, create_changelog_entries, create_tool_structure, create_people. Updates on those IDs (update_workflow, update_org, update_attributes, update_people) all return Ecto.Repo.get nil. link_to_steps returns "Unknown link type: " and delete returns "Unknown type: " regardless of payload.
Hypotheses: per-client feature flag, User-Agent gating, or writes hitting a shadow DB. Reads work from both clients.
Feature requests: (1) return 4xx or full record (id+name) on write failure instead of 200 + fake id; (2) dry-run mode; (3) real error messages on link_to_steps and delete; (4) document User-Agent / auth-claim requirements for third-party MCP clients (Hermes, Cursor, Cline); (5) workspace-level write audit log accessible via MCP.