GitHub is a direct integration: Polycore hosts the connection to GitHub’s
own remote MCP server, so there is no runner to deploy and nothing to build.
An owner or admin connects it once per project, and everyone in the connection’s
audience can ask about repositories, issues, pull requests, and Actions runs
from Slack, the dashboard, an MCP client, or a page.
GitHub owns the tools. Polycore owns everything that makes them governed: who
may use the connection, which tools are enabled, how hazardous each one is,
whether a call runs or waits for a human, and the audit row that names both the
caller and the GitHub account the call acted as.
Architecture
The control plane never holds the token. It holds the connection, the pinned
tool list, and the audit trail. The token is sealed with envelope encryption in
an isolated executor that is unreachable from the public internet, and the
executor refuses any request or redirect that leaves api.githubcopilot.com.
What it can do
Polycore connects to the context, repos, issues, pull_requests, and
actions toolsets, and classifies every tool GitHub advertises:
- Reads run when they are called: listing commits, reading files, searching
issues and pull requests, reading Actions runs and job logs.
- Writes wait for one human approval: filing and editing issues, commenting,
opening and merging pull requests, committing files, running workflows.
- Anything else GitHub adds that Polycore has not classified is treated as
unknown. It is gated like a write, and it arrives disabled so an admin
reviews it before anyone can call it.
This is shared authority, not personal GitHub access. Everyone in the
connection’s audience acts through the one token, reaching repositories their
own GitHub account may not be able to open, and writes are attributed to the
account that authorized the connection. The token’s repository scope is the
resource boundary, so grant it narrowly.
Connect it
- In GitHub, create a
fine-grained personal access token.
Select only the repositories this connection should reach, and grant read
access to Metadata, Contents, Issues, Pull requests, and Actions.
- In Polycore, open Project settings → Integrations, pick GitHub, and
choose Connect.
- Give the connection a name and a namespace. The namespace prefixes every
capability, so
code makes code/list_pull_requests.
- Paste the token and choose who may use it: everyone in the organization, or
owners and admins only.
The token crosses to the executor once, in memory, and is never returned,
logged, or shown again. Polycore then asks GitHub who the token acts as and
what tools it advertises, and pins both to the connection.
Using it
Ask in Slack, or from any front door:
The audit row records the caller, the connection, the tool, and the GitHub
login the call acted as, so “who read this, as whom” is answerable without
reading logs.
Capabilities appear in the catalog under the connection’s namespace:
Agent and MCP tool names are direct__<namespace>__<tool>.
GitHub adds and changes tools on its own schedule. Refresh tools on the
connection re-lists them and shows the difference: schemas and descriptions are
updated in place, tools GitHub no longer offers are marked, and anything new
arrives disabled until an admin reviews it. A vendor cannot widen what your
project can call without someone looking at it first.
Limits
- Token, not OAuth. A fine-grained personal access token today; connecting
with a GitHub App is next.
- One connection per GitHub account. Add a second connection with its own
namespace for a second account or a different repository scope.
Removing it
Remove connection stops calls at once, drops the tools from the catalog, and
deletes the encrypted credential. Polycore cannot revoke the token at GitHub, so
delete or rotate it there too. The audit history stays.