@@ -20,15 +20,19 @@ jobs:
2020 - target : x86_64-unknown-linux-gnu
2121 os : ubuntu-latest
2222 archive : tar.gz
23+ binary : task-graph-mcp
2324 - target : x86_64-apple-darwin
2425 os : macos-latest
2526 archive : tar.gz
27+ binary : task-graph-mcp
2628 - target : aarch64-apple-darwin
2729 os : macos-latest
2830 archive : tar.gz
31+ binary : task-graph-mcp
2932 - target : x86_64-pc-windows-msvc
3033 os : windows-latest
3134 archive : zip
35+ binary : task-graph-mcp.exe
3236
3337 steps :
3438 - uses : actions/checkout@v4
@@ -55,11 +59,109 @@ jobs:
5559 7z a ../../../task-graph-mcp-${{ matrix.target }}.zip task-graph-mcp.exe
5660 cd ../../..
5761
62+ - name : Extract version from tag
63+ id : version
64+ shell : bash
65+ run : |
66+ if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
67+ echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
68+ else
69+ echo "version=$(grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')" >> "$GITHUB_OUTPUT"
70+ fi
71+
72+ - name : Create MCPB bundle
73+ shell : bash
74+ run : |
75+ VERSION="${{ steps.version.outputs.version }}"
76+ TARGET="${{ matrix.target }}"
77+ BINARY="${{ matrix.binary }}"
78+
79+ mkdir -p mcpb-staging
80+ cp "target/${TARGET}/release/${BINARY}" mcpb-staging/
81+
82+ cat > mcpb-staging/manifest.json << EOF
83+ {
84+ "manifest_version": "0.3",
85+ "name": "task-graph-mcp",
86+ "version": "${VERSION}",
87+ "description": "MCP server for agent task workflows with phases, prompts, gates, and multi-agent coordination",
88+ "author": {
89+ "name": "Oortonaut",
90+ "url": "https://github.com/Oortonaut"
91+ },
92+ "license": "Apache-2.0",
93+ "repository": "https://github.com/Oortonaut/task-graph-mcp",
94+ "server": {
95+ "type": "binary",
96+ "entry_point": "${BINARY}",
97+ "mcp_config": {
98+ "command": "${BINARY}",
99+ "args": [],
100+ "env": {}
101+ }
102+ },
103+ "tools": [
104+ {"name": "connect", "description": "Register agent and join workflow"},
105+ {"name": "create", "description": "Create a new task"},
106+ {"name": "create_tree", "description": "Create a task hierarchy from YAML"},
107+ {"name": "update", "description": "Update task state, description, or dependencies"},
108+ {"name": "get", "description": "Get full task details"},
109+ {"name": "list_tasks", "description": "List and filter tasks"},
110+ {"name": "delete", "description": "Delete a task"},
111+ {"name": "rename", "description": "Rename a task ID"},
112+ {"name": "claim", "description": "Claim a ready task"},
113+ {"name": "scan", "description": "Get task tree with agent context"},
114+ {"name": "thinking", "description": "Record agent reasoning"},
115+ {"name": "query", "description": "Run read-only SQL queries"},
116+ {"name": "link", "description": "Add dependency between tasks"},
117+ {"name": "unlink", "description": "Remove dependency between tasks"},
118+ {"name": "mark_file", "description": "Lock a file for an agent"},
119+ {"name": "unmark_file", "description": "Release a file lock"},
120+ {"name": "list_marks", "description": "List active file locks"},
121+ {"name": "check_gates", "description": "Evaluate workflow gate conditions"},
122+ {"name": "list_workflows", "description": "List available workflows"},
123+ {"name": "add_overlay", "description": "Add a dynamic workflow overlay"},
124+ {"name": "remove_overlay", "description": "Remove a workflow overlay"},
125+ {"name": "give_feedback", "description": "Record inter-agent feedback"},
126+ {"name": "list_feedback", "description": "List recorded agent feedback"},
127+ {"name": "list_skills", "description": "List available bundled skills"},
128+ {"name": "get_skill", "description": "Get bundled skill content"},
129+ {"name": "cleanup_stale", "description": "Evict stale workers"}
130+ ],
131+ "keywords": ["mcp", "agent-workflow", "multi-agent", "task-management", "coordination"]
132+ }
133+ EOF
134+
135+ cd mcpb-staging
136+ if command -v zip &> /dev/null; then
137+ zip -r "../task-graph-mcp-${TARGET}.mcpb" .
138+ elif command -v 7z &> /dev/null; then
139+ 7z a -tzip "../task-graph-mcp-${TARGET}.mcpb" .
140+ else
141+ echo "No zip tool available" && exit 1
142+ fi
143+ cd ..
144+
145+ # Compute SHA-256
146+ if command -v sha256sum &> /dev/null; then
147+ SHA=$(sha256sum "task-graph-mcp-${TARGET}.mcpb" | awk '{print $1}')
148+ elif command -v shasum &> /dev/null; then
149+ SHA=$(shasum -a 256 "task-graph-mcp-${TARGET}.mcpb" | awk '{print $1}')
150+ else
151+ SHA=$(openssl dgst -sha256 "task-graph-mcp-${TARGET}.mcpb" | awk '{print $NF}')
152+ fi
153+ echo "sha256=${SHA}" >> "$GITHUB_OUTPUT"
154+ echo "${TARGET}=${SHA}" > "mcpb-sha256-${TARGET}.txt"
155+ id : mcpb
156+
58157 - name : Upload artifact
59158 uses : actions/upload-artifact@v4
60159 with :
61160 name : task-graph-mcp-${{ matrix.target }}
62- path : task-graph-mcp-${{ matrix.target }}.${{ matrix.archive }}
161+ path : |
162+ task-graph-mcp-${{ matrix.target }}.${{ matrix.archive }}
163+ task-graph-mcp-${{ matrix.target }}.mcpb
164+ mcpb-sha256-${{ matrix.target }}.txt
63165
64166 release :
65167 name : Create Release
68170 if : startsWith(github.ref, 'refs/tags/')
69171 permissions :
70172 contents : write
173+ id-token : write
71174
72175 steps :
73176 - uses : actions/checkout@v4
@@ -77,11 +180,89 @@ jobs:
77180 with :
78181 path : artifacts
79182
183+ - name : Extract version from tag
184+ id : version
185+ run : echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT"
186+
187+ - name : Generate server.json with SHA-256 hashes
188+ run : |
189+ VERSION="${{ steps.version.outputs.version }}"
190+
191+ # Read SHA-256 hashes
192+ SHA_LINUX=$(cat artifacts/task-graph-mcp-x86_64-unknown-linux-gnu/mcpb-sha256-x86_64-unknown-linux-gnu.txt | cut -d= -f2)
193+ SHA_MACOS_X86=$(cat artifacts/task-graph-mcp-x86_64-apple-darwin/mcpb-sha256-x86_64-apple-darwin.txt | cut -d= -f2)
194+ SHA_MACOS_ARM=$(cat artifacts/task-graph-mcp-aarch64-apple-darwin/mcpb-sha256-aarch64-apple-darwin.txt | cut -d= -f2)
195+ SHA_WINDOWS=$(cat artifacts/task-graph-mcp-x86_64-pc-windows-msvc/mcpb-sha256-x86_64-pc-windows-msvc.txt | cut -d= -f2)
196+
197+ cat > server.json << EOF
198+ {
199+ "\$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
200+ "name": "io.github.Oortonaut/task-graph-mcp",
201+ "description": "MCP server for agent task workflows with phases, prompts, gates, and multi-agent coordination",
202+ "version": "${VERSION}",
203+ "repository": {
204+ "url": "https://github.com/Oortonaut/task-graph-mcp",
205+ "source": "github"
206+ },
207+ "packages": [
208+ {
209+ "registryType": "mcpb",
210+ "identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-unknown-linux-gnu.mcpb",
211+ "version": "${VERSION}",
212+ "fileSha256": "${SHA_LINUX}",
213+ "transport": { "type": "stdio" }
214+ },
215+ {
216+ "registryType": "mcpb",
217+ "identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-apple-darwin.mcpb",
218+ "version": "${VERSION}",
219+ "fileSha256": "${SHA_MACOS_X86}",
220+ "transport": { "type": "stdio" }
221+ },
222+ {
223+ "registryType": "mcpb",
224+ "identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-aarch64-apple-darwin.mcpb",
225+ "version": "${VERSION}",
226+ "fileSha256": "${SHA_MACOS_ARM}",
227+ "transport": { "type": "stdio" }
228+ },
229+ {
230+ "registryType": "mcpb",
231+ "identifier": "https://github.com/Oortonaut/task-graph-mcp/releases/download/v${VERSION}/task-graph-mcp-x86_64-pc-windows-msvc.mcpb",
232+ "version": "${VERSION}",
233+ "fileSha256": "${SHA_WINDOWS}",
234+ "transport": { "type": "stdio" }
235+ }
236+ ]
237+ }
238+ EOF
239+
240+ echo "Generated server.json:"
241+ cat server.json
242+
80243 - name : Upload release artifacts
81244 uses : softprops/action-gh-release@v2
82245 with :
83246 draft : false
84247 files : |
85- artifacts/**/*
248+ artifacts/**/*.tar.gz
249+ artifacts/**/*.zip
250+ artifacts/**/*.mcpb
251+ server.json
86252 env :
87253 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
254+
255+ - name : Install mcp-publisher
256+ run : |
257+ curl -fsSL https://registry.modelcontextprotocol.io/publisher/install.sh | sh || true
258+ which mcp-publisher || echo "mcp-publisher not available, skipping registry publish"
259+
260+ - name : Publish to MCP Registry
261+ if : success()
262+ run : |
263+ if command -v mcp-publisher &> /dev/null; then
264+ mcp-publisher login github-oidc
265+ mcp-publisher publish
266+ else
267+ echo "::warning::mcp-publisher not installed. Publish server.json manually after release."
268+ fi
0 commit comments