Explorar o código

feat: add list_organization_repositories tool for accessing org repos

Fszontagh hai 5 meses
pai
achega
e6c814ea99
Modificáronse 2 ficheiros con 47 adicións e 0 borrados
  1. 20 0
      src/gogs-client.ts
  2. 27 0
      src/server.ts

+ 20 - 0
src/gogs-client.ts

@@ -50,6 +50,18 @@ export class GogsClient {
         ...(config.accessToken && { Authorization: `token ${config.accessToken}` }),
       },
     });
+
+    this.client.interceptors.response.use(
+      response => response,
+      error => {
+        if (error.response) {
+          const errorMsg = `[Gogs API Error] ${error.config.method?.toUpperCase()} ${error.config.url}: ${error.response.status} ${JSON.stringify(error.response.data)}`;
+          const customError = new Error(errorMsg);
+          return Promise.reject(customError);
+        }
+        return Promise.reject(error);
+      }
+    );
   }
 
   /**
@@ -94,6 +106,14 @@ export class GogsClient {
     return response.data;
   }
 
+  /**
+   * List repositories for an organization
+   */
+  async listOrganizationRepositories(orgname: string): Promise<GogsRepository[]> {
+    const response = await this.client.get<GogsRepository[]>(`/orgs/${orgname}/repos`);
+    return response.data;
+  }
+
   /**
    * Search for repositories
    */

+ 27 - 0
src/server.ts

@@ -641,6 +641,20 @@ export function createMcpServer(gogsClient: GogsClient, restrictedOwner?: string
             },
           },
         },
+        {
+          name: 'list_organization_repositories',
+          description: 'List Gogs repositories for an organization',
+          inputSchema: {
+            type: 'object',
+            properties: {
+              orgname: {
+                type: 'string',
+                description: 'Organization name',
+              },
+            },
+            required: ['orgname'],
+          },
+        },
         {
           name: 'search_repositories',
           description: 'Search for Gogs repositories',
@@ -2558,6 +2572,19 @@ export function createMcpServer(gogsClient: GogsClient, restrictedOwner?: string
           };
         }
 
+        case 'list_organization_repositories': {
+          const orgname = z.object({ orgname: z.string() }).parse(args).orgname;
+          const repos = await gogsClient.listOrganizationRepositories(orgname);
+          return {
+            content: [
+              {
+                type: 'text',
+                text: JSON.stringify(repos, null, 2),
+              },
+            ],
+          };
+        }
+
         case 'search_repositories': {
           const { query, uid, limit, page } = SearchReposSchema.parse(args);
           const repos = await gogsClient.searchRepositories(query, { uid, limit, page });