The problem: every system is different, and connectors are where credentials live
An authorization layer is only useful if the action goes through it. Something has to carry an approved action to the real system, and that something usually holds the keys. Build it badly and you leak a credential to the agent or open a side door around the check.What is built in
Four connectors ship with the server. Each registers only when its own credentials are configured:- Paytm: one action, a customer refund. It is a remote connector: Parmana forwards an approved refund to a separate service, which is the only thing that holds the Paytm merchant key.
- HubSpot: updating a deal’s stage and amount, and reading a deal. Nothing else. It was run live against a real HubSpot test account through a locally started server, not through the public deployment.
- GitHub: reading a pull request and merging one. Tested against a mock GitHub server. A live run against a real GitHub App installation has not been done yet.
- Slack: posting a message, only to a channel that is the request’s target and on the server’s allowlist. Slack was not configured in production when I last checked.
What is a mock, and says so
The connector SDK also containsSapConnector, OracleConnector, WorkdayConnector and SalesforceConnector. They are reference mocks: in memory, deterministic, each carrying a comment saying it stands in “until the real enterprise connector is implemented”. They never call SAP, Oracle, Workday or Salesforce, and none is wired into the default server. They give connector authors a realistic shape to work against.
The idea: put a small endpoint in front of the system, and register it
For a system with no built-in connector, the answer since 2026-10-01 is an external endpoint, connected with no change to Parmana’s code. The finance team runs a small HTTPS service in front of their ERP. Parmana sends it each approved invoice as a signed release. The endpoint checks the signature, acts with its own credentials, and answers. Parmana holds none of the ERP’s credentials. The steps, in order:- Write a policy for the action, say
erp:create-invoice. It must require a signed approval: the server refuses a policy whose approve rule does not. Facts the agent declares can refuse, never authorize. - Two people approve the policy. One proposes it, a second approves it with a step-up signature.
- Run the endpoint. There are examples in TypeScript and Python. The SDK helper,
verifyParmanaReleaseorverify_parmana_release, published in SDK 1.5.0, checks the signature, that the release is addressed to this endpoint, and that it has not expired. - Two people approve the registration: the action, the endpoint, the policy, and the only parameter names Parmana may forward.
- Grant the action to the agent’s key, and make sure an approver is trusted.
https, names an IP address or localhost, or resolves to an address that is not public. It checks the address when the registration is proposed, again when it is approved, and before every release, then connects to the address it checked and follows no redirect.
This was checked live in production once, on 2026-10-01, with an endpoint that acts on nothing. Without an approval the request was refused and nothing released; with one it was released and the record verified offline; the same approval reused was refused.
Execute only if still valid
When a policy takes facts from a business system (“this invoice is paid”), the release carries them as signed conditions, each with a time it is valid until. The endpoint should check them in its own records, in the same transaction as the action, and decline if one no longer holds. Parmana records that nothing was done.Writing a built-in connector
For a deeper integration there is the connector SDK: aConnector interface with one execute method, a mock for hermetic tests, and a credential provider seam. A built-in connector is a source change: a package, an adapter inside the gateway, and an entry in the server’s connector registry. The repository has a checklist for it.
What it does not do
- No real SAP, Oracle, Workday or Salesforce connector. Also none for Stripe, ServiceNow, Jira or a database.
- An endpoint’s answer is its claim. The record proves what Parmana released and what the endpoint said, not what the ERP did.
- “Execute only if still valid” is the endpoint’s job. Parmana signs the conditions; it cannot make an endpoint check them. Built-in connectors get only the gateway’s re-check before release.
- A new built-in connector needs a deploy. New policy versions, approvers and external endpoints do not.
- Connector secrets are static environment values. An AWS Secrets Manager provider exists in code but is not provisioned.
- Two credentials, not proven two people. In the live check one person held the maker, checker and approver keys.
- It is slow. An approved request took 24 to 32 seconds in production.
- A registered policy name is checked for form only. If that policy has no approved version, every request for the action is refused.