From 9c7dd17e6851572738ed9ce86f2f7b18b57fda7a Mon Sep 17 00:00:00 2001 From: Jonathan Miller Date: Sun, 21 Jun 2026 18:13:29 -0500 Subject: [PATCH] =?UTF-8?q?fix:=20deep=20scan=20=E2=80=94=20issue=20search?= =?UTF-8?q?=20endpoint,=20asset=20upload,=20metadata=20guard,=20file=20cre?= =?UTF-8?q?ate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - gitea_issue_search: fixed endpoint from /repos/search to /repos/issues/search - gitea_release_asset_upload: use fetch with application/octet-stream instead of JSON-stringified Buffer via client.post (which set wrong Content-Type) - gitea_metadata_update: guard against GET failure before spreading into merged object - gitea_bulk_file_push: use PUT (not POST) for file creation per Gitea Contents API - Server version updated from 1.0.0 to 1.4.2 --- src/index.ts | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/index.ts b/src/index.ts index fd5043c..fc99016 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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) }; + const merged = current.status < 400 ? { ...(current.data as Record) } : {}; for (const [k, v] of Object.entries(fields)) { if (v !== undefined) merged[k] = v; } -- 2.52.0