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 createtab and updatetab work. Same MCP works fine from Claude desktop on the same workspace, so the bug appears client- or User-Agent-specific.
Affected (all return fake success or Ecto nil): createprocess, createorgstructure, createdatamodel, createchangelogentries, createtoolstructure, createpeople. Updates on those IDs (updateworkflow, updateorg, updateattributes, updatepeople) all return Ecto.Repo.get nil. linktosteps 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 linktosteps 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.
Log in to comment and vote
Comments1
Mark Moore
Aug 6
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 createtab and updatetab 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
createpeople people=[{first:"Test", last:"User"}] → listpeople query=Test → 0 results
update on the returned id errors
createprocess sections=[{name:"Test", steps:[{name:"S1"}]}] updateworkflow sections=[{id:, name:"Renamed"}] → "Ecto.Repo.get/2 … nil"
Affected (all return fake success or Ecto nil): createprocess, createorgstructure, createdatamodel, createchangelogentries, createtoolstructure, createpeople. Updates on those IDs (updateworkflow, updateorg, updateattributes, updatepeople) all return Ecto.Repo.get nil. linktosteps 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 linktosteps 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.