SDK for building engines on the GitHub Copilot agent platform.
The Copilot Engine SDK provides everything you need to build an engine that runs on the GitHub Copilot agent platform:
- Platform Client — send structured events (assistant messages, tool executions, progress updates) to the platform API
- Git Utilities — clone repositories, commit and push changes with secure credential handling
- MCP Server — a Model Context Protocol server exposing
report_progressandreply_to_commenttools - MCP Proxy Discovery — discover and connect to user-configured MCP servers
- Event Factories — create typed platform events for custom event pipelines
- CLI — local testing harness that simulates the platform for development
- Integration Guide — step-by-step guide to building an engine
Until this package is published to a package registry, install it directly from GitHub:
{
"dependencies": {
"@github/copilot-engine-sdk": "github:github/copilot-engine-sdk#main"
}
}Then run npm install.
For local development with a cloned copy of the SDK:
# In the SDK directory — register for linking and build
cd copilot-engine-sdk
npm link
# In your engine directory — link to local SDK
cd ../your-engine
npm link @github/copilot-engine-sdkChanges to the SDK source are reflected immediately after running npm run build in the SDK directory.
import {
PlatformClient,
cloneRepo,
finalizeChanges,
createEngineMcpServer,
} from "@github/copilot-engine-sdk";
// Initialize the platform client for event reporting
const platform = new PlatformClient({
apiUrl: process.env.GITHUB_PLATFORM_API_URL!,
jobId: process.env.GITHUB_JOB_ID!,
token: process.env.GITHUB_PLATFORM_API_TOKEN!,
});
// Clone the target repository
const repoLocation = cloneRepo({
serverUrl: "https://github.com",
repository: "owner/repo",
gitToken: process.env.GITHUB_GIT_TOKEN!,
branchName: "copilot/fix-issue-123",
commitLogin: "copilot[bot]",
commitEmail: "copilot@github.com",
});
// Send events to the platform
await platform.sendAssistantMessage({
turn: 1,
callId: "call-123",
content: "I'll help you with that.",
toolCalls: [],
});
// Finalize and push any remaining changes
finalizeChanges(repoLocation, "Apply fixes");The main client for communicating with the platform API. Handles event reporting, progress updates, and history persistence.
const platform = new PlatformClient({
apiUrl: string; // Platform API URL
jobId: string; // Job identifier
token: string; // API authentication token
nonce?: string; // Optional job nonce
});Event Methods:
sendAssistantMessage(opts)— report an assistant response with optional tool callssendToolMessage(opts)— report a tool result messagesendToolExecution(opts)— report a tool call and its resultsendModelCallFailure(opts)— report a model invocation failuresendTruncation(opts)— report context truncationsendResponse(opts)— report a final response
Progress Methods:
sendReportProgress(opts)— update PR title and descriptionsendCommentReply(opts)— reply to a PR comment
History Methods:
sendRawProgress(payloads)— send raw progress payloads (used for session history persistence)fetchProgress(opts)— retrieve previously stored progress records
Secure git operations with credential handling via http.extraHeader (tokens never appear in URLs or process listings).
import { cloneRepo, commitAndPush, finalizeChanges } from "@github/copilot-engine-sdk";
// Clone a repository with branch setup
const repoPath = cloneRepo({
serverUrl: string; // e.g., "https://github.com"
repository: string; // "owner/repo"
gitToken: string; // installation token
branchName: string; // branch to checkout or create
commitLogin: string; // git author name
commitEmail: string; // git author email
cloneDir?: string; // default: "/tmp/workspace"
});
// Commit and push changes (force push for engine-owned branches)
const result = commitAndPush(repoPath, "commit message");
// Finalize: commit + push any remaining uncommitted changes (non-fatal)
finalizeChanges(repoPath, "final commit message");Branch handling:
- If the branch exists on remote, it checks out the existing branch
- If the branch doesn't exist, it creates a new branch from the default branch
- Uses
git ls-remoteto distinguish "branch not found" from auth/network errors
The SDK includes an MCP server that can be used with any LLM SDK that supports the Model Context Protocol.
Tools provided:
report_progress— commits changes and updates the PR description with a progress checklistreply_to_comment— replies to a PR review comment
import { createEngineMcpServer, startEngineMcpServer } from "@github/copilot-engine-sdk";
const server = createEngineMcpServer({
workingDir: "/path/to/repo",
push: true, // push commits to remote (default: true)
platformClient: platform, // optional: enables PR description updates
logFile: "/tmp/mcp.log", // optional: log file path (default: /tmp/mcp-server.log)
});
// Start as STDIO MCP server
await startEngineMcpServer(server);Standalone usage (spawned as a child process):
node dist/mcp-server.js /path/to/working-directoryDiscover user-configured MCP servers passed to the engine via the platform.
import { discoverMCPServers, isMCPProxyAvailable } from "@github/copilot-engine-sdk";
// Check if MCP proxy is available
if (isMCPProxyAvailable()) {
const servers = discoverMCPServers();
// Returns discovered MCP servers the user has configured
}For advanced usage, create event objects directly:
import {
createAssistantMessageEvent,
createToolMessageEvent,
createToolExecutionEvent,
createModelCallFailureEvent,
createTruncationEvent,
createResponseEvent,
} from "@github/copilot-engine-sdk";The SDK includes a CLI tool for testing engines locally without the full platform infrastructure. It simulates the platform API, clones a repo, and runs your engine command.
cd cli && go build ./cmd/engine-cli
engine-cli run "node dist/index.js" \
--repo https://github.com/owner/repo \
--problem-statement "Fix the bug in auth.ts" \
--action fix \
--timeout 5mThe CLI:
- Clones the target repository to a temp directory
- Starts a mock HTTP server that mimics the platform API
- Spawns your engine with the required environment variables
- Displays progress events in formatted output
See engine-cli run --help for all options.
Engines receive these environment variables from the platform:
| Variable | Description |
|---|---|
GITHUB_JOB_ID |
Unique job identifier |
GITHUB_PLATFORM_API_TOKEN |
Token for platform API authentication |
GITHUB_PLATFORM_API_URL |
Platform API base URL |
GITHUB_JOB_NONCE |
Job nonce for request signing |
GITHUB_INFERENCE_TOKEN |
Token for LLM inference calls |
GITHUB_INFERENCE_URL |
Inference API endpoint |
GITHUB_GIT_TOKEN |
Token for git operations |
- Integration Guide — step-by-step guide to building an engine from scratch
See CONTRIBUTING.md for local setup, build commands, and pull request guidance.
See SUPPORT.md for how to ask questions or report bugs.
See SECURITY.md for how to report security vulnerabilities.
See LICENSE.