fix: deep scan — issue search, asset upload, metadata guard, file create #26

Merged
jmiller merged 1 commits from fix/deep-scan-bugs into main 2026-06-21 23:14:31 +00:00
+21 -12
View File
@@ -61,7 +61,7 @@ const OwnerRepo = {
const server = new McpServer({
name: 'mokogitea-api-mcp',
version: '1.0.0',
version: '1.4.2',
});
// ── User / Auth ─────────────────────────────────────────────────────────
@@ -551,7 +551,7 @@ server.tool(
if (state) params['state'] = state;
if (labels) params['labels'] = labels;
if (type) params['type'] = type;
return formatResponse(await clientFor(connection).get('/repos/search', params));
return formatResponse(await clientFor(connection).get('/repos/issues/search', params));
},
);
@@ -871,14 +871,23 @@ server.tool(
...ConnectionParam,
},
async ({ owner, repo, release_id, name, content_base64, connection }) => {
const client = clientFor(connection);
// Gitea expects multipart form data for asset upload
// For now, use the API with the binary content
const res = await client.post(
`/repos/${owner}/${repo}/releases/${release_id}/assets?name=${encodeURIComponent(name)}`,
Buffer.from(content_base64, 'base64'),
);
return formatResponse(res);
const conn = getConnection(config, connection);
const baseUrl = conn.baseUrl.replace(/\/+$/, '') + '/api/v1';
const url = `${baseUrl}/repos/${owner}/${repo}/releases/${release_id}/assets?name=${encodeURIComponent(name)}`;
const buf = Buffer.from(content_base64, 'base64');
const resp = await fetch(url, {
method: 'POST',
headers: {
'Authorization': `token ${conn.token}`,
'Content-Type': 'application/octet-stream',
'Content-Length': String(buf.byteLength),
},
body: buf,
});
const raw = await resp.text();
let data: unknown;
try { data = JSON.parse(raw); } catch { data = raw; }
return formatResponse({ status: resp.status, data });
},
);
@@ -929,7 +938,7 @@ server.tool(
results.push({ repo, status: 'updated' });
} else {
// Create new file
await client.post(`/repos/${owner}/${repo}/contents/${path}`, {
await client.put(`/repos/${owner}/${repo}/contents/${path}`, {
content: content_base64,
message,
branch: targetBranch,
@@ -1742,7 +1751,7 @@ server.tool(
async ({ owner, repo, connection, ...fields }) => {
const c = clientFor(connection);
const current = await c.get(`/repos/${owner}/${repo}/metadata`);
const merged = { ...(current.data as Record<string, unknown>) };
const merged = current.status < 400 ? { ...(current.data as Record<string, unknown>) } : {};
for (const [k, v] of Object.entries(fields)) {
if (v !== undefined) merged[k] = v;
}