@ama-mcp/github 13.3.0-prerelease.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ Copyright Amadeus SAS
2
+
3
+ Redistribution and use in source and binary forms, with or without modification,
4
+ are permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this
7
+ list of conditions and the following disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ this list of conditions and the following disclaimer in the documentation and/or
11
+ other materials provided with the distribution.
12
+
13
+ 3. Neither the name of the copyright holder nor the names of its contributors
14
+ may be used to endorse or promote products derived from this software without
15
+ specific prior written permission.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
21
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.md ADDED
@@ -0,0 +1,17 @@
1
+ <h1 align="center">Otter MCP</h1>
2
+ <p align="center">
3
+ <img src="https://raw.githubusercontent.com/AmadeusITGroup/otter/main/assets/logo/otter.png" alt="Super cute Otter!" width="40%"/>
4
+ </p>
5
+
6
+ <br />
7
+ <br />
8
+
9
+ ## Description
10
+
11
+ This module provides a set of MCP tools to retrieve information from GitHub.
12
+
13
+ ## Tools
14
+
15
+ - [get_repositories_using_<library_name>](./src/find-repositories-using-library/README.md)
16
+ - [get_release_notes_<library_name>](./src/release-notes/README.md)
17
+ - [get_supported_releases_<library_name>](./src/supported-releases/README.md)
package/package.json ADDED
@@ -0,0 +1,165 @@
1
+ {
2
+ "name": "@ama-mcp/github",
3
+ "version": "13.3.0-prerelease.11",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "This module provides a set of MCP tools to retrieve information from GitHub",
8
+ "keywords": [
9
+ "mcp",
10
+ "github",
11
+ "otter",
12
+ "otter-module"
13
+ ],
14
+ "module": "src/public_api.js",
15
+ "typings": "src/public_api.d.ts",
16
+ "sideEffects": false,
17
+ "exports": {
18
+ "./package.json": {
19
+ "default": "./package.json"
20
+ },
21
+ ".": {
22
+ "typings": "./src/public_api.d.ts",
23
+ "default": "./src/public_api.js"
24
+ }
25
+ },
26
+ "scripts": {
27
+ "nx": "nx",
28
+ "ng": "yarn nx",
29
+ "build": "yarn nx build ama-mcp-github",
30
+ "compile": "tsc -b ./tsconfig.build.json && yarn cpy package.json dist && patch-package-json-main"
31
+ },
32
+ "peerDependencies": {
33
+ "@ama-mcp/core": "^13.3.0-prerelease.11",
34
+ "@modelcontextprotocol/sdk": "~1.19.0",
35
+ "@octokit/rest": "^22.0.0",
36
+ "zod": "~3.25.76"
37
+ },
38
+ "dependencies": {
39
+ "tslib": "^2.6.2"
40
+ },
41
+ "devDependencies": {
42
+ "@ama-mcp/core": "^13.3.0-prerelease.11",
43
+ "@angular/common": "~20.3.0",
44
+ "@angular/compiler": "~20.3.0",
45
+ "@angular/compiler-cli": "~20.3.0",
46
+ "@angular/core": "~20.3.0",
47
+ "@angular/platform-browser": "~20.3.0",
48
+ "@angular/platform-browser-dynamic": "~20.3.0",
49
+ "@eslint-community/eslint-plugin-eslint-comments": "^4.4.0",
50
+ "@modelcontextprotocol/sdk": "~1.19.0",
51
+ "@nx/eslint": "~21.6.0",
52
+ "@nx/eslint-plugin": "~21.6.0",
53
+ "@nx/jest": "~21.6.0",
54
+ "@nx/js": "~21.6.0",
55
+ "@o3r/build-helpers": "^13.3.0-prerelease.11",
56
+ "@o3r/eslint-config": "^13.3.0-prerelease.11",
57
+ "@o3r/eslint-plugin": "^13.3.0-prerelease.11",
58
+ "@o3r/test-helpers": "^13.3.0-prerelease.11",
59
+ "@octokit/rest": "~22.0.0",
60
+ "@stylistic/eslint-plugin": "~5.4.0",
61
+ "@types/jest": "~29.5.2",
62
+ "@types/node": "~22.18.0",
63
+ "@typescript-eslint/parser": "~8.46.0",
64
+ "angular-eslint": "~20.3.0",
65
+ "cpy-cli": "^6.0.0",
66
+ "eslint": "~9.37.0",
67
+ "eslint-import-resolver-node": "~0.3.9",
68
+ "eslint-import-resolver-typescript": "~4.4.0",
69
+ "eslint-plugin-import": "~2.32.0",
70
+ "eslint-plugin-import-newlines": "~1.4.0",
71
+ "eslint-plugin-jest": "~29.0.0",
72
+ "eslint-plugin-jsdoc": "~54.7.0",
73
+ "eslint-plugin-prefer-arrow": "~1.2.3",
74
+ "eslint-plugin-unicorn": "~60.0.0",
75
+ "eslint-plugin-unused-imports": "~4.2.0",
76
+ "globals": "^16.0.0",
77
+ "jest": "~29.7.0",
78
+ "jest-environment-jsdom": "~29.7.0",
79
+ "jest-junit": "~16.0.0",
80
+ "jest-preset-angular": "~14.6.0",
81
+ "jest-util": "~29.7.0",
82
+ "jsonc-eslint-parser": "~2.4.0",
83
+ "nx": "~21.6.0",
84
+ "rxjs": "^7.8.1",
85
+ "ts-jest": "~29.4.0",
86
+ "ts-node": "~10.9.2",
87
+ "type-fest": "^4.30.1",
88
+ "typescript": "~5.9.2",
89
+ "typescript-eslint": "~8.46.0",
90
+ "zod": "~3.25.76",
91
+ "zone.js": "~0.15.0"
92
+ },
93
+ "engines": {
94
+ "node": "^20.19.0 || ^22.17.0 || ^24.0.0"
95
+ },
96
+ "contributors": [
97
+ {
98
+ "name": "Yannick Adam",
99
+ "url": "https://github.com/yannickadam",
100
+ "email": "yannickadam@users.noreply.github.com"
101
+ },
102
+ {
103
+ "name": "Kilian Panot",
104
+ "url": "https://github.com/kpanot",
105
+ "email": "kpanot@users.noreply.github.com"
106
+ },
107
+ {
108
+ "name": "Jeremy Bourgeois",
109
+ "url": "https://github.com/jbourgeois-1A",
110
+ "email": "jbourgeois-1A@users.noreply.github.com"
111
+ },
112
+ {
113
+ "name": "Pierre Henri Ginoux",
114
+ "url": "https://github.com/pginoux-1A",
115
+ "email": "pginoux-1A@users.noreply.github.com"
116
+ },
117
+ {
118
+ "name": "Mircea Vasile Rednic",
119
+ "url": "https://github.com/mrednic-1A",
120
+ "email": "mrednic-1A@users.noreply.github.com"
121
+ },
122
+ {
123
+ "name": "Stephane Dalle",
124
+ "url": "https://github.com/sdalle-1A",
125
+ "email": "sdalle-1A@users.noreply.github.com"
126
+ },
127
+ {
128
+ "name": "Nicolas Hoffmann",
129
+ "url": "https://github.com/nhoffmann-1A",
130
+ "email": "nhoffmann-1A@users.noreply.github.com"
131
+ },
132
+ {
133
+ "name": "Victor Scaiceanu",
134
+ "url": "https://github.com/vscaiceanu-1a",
135
+ "email": "vscaiceanu-1A@users.noreply.github.com"
136
+ },
137
+ {
138
+ "name": "Florian Paul",
139
+ "url": "https://github.com/fpaul-1A",
140
+ "email": "fpaul-1A@users.noreply.github.com"
141
+ },
142
+ {
143
+ "name": "Corinne Paulve",
144
+ "url": "https://github.com/cpaulve-1A",
145
+ "email": "cpaulve-1A@users.noreply.github.com"
146
+ },
147
+ {
148
+ "name": "Matthieu Crouzet",
149
+ "url": "https://github.com/matthieu-crouzet",
150
+ "email": "matthieu-crouzet@users.noreply.github.com"
151
+ },
152
+ {
153
+ "name": "Salome Do",
154
+ "url": "https://github.com/sdo-1A",
155
+ "email": "sdo-1A@users.noreply.github.com"
156
+ }
157
+ ],
158
+ "bugs": "https://github.com/AmadeusITGroup/otter/issues",
159
+ "repository": {
160
+ "type": "git",
161
+ "url": "git+https://github.com/AmadeusITGroup/otter.git"
162
+ },
163
+ "license": "BSD-3-Clause",
164
+ "homepage": "https://amadeusitgroup.github.io/otter/"
165
+ }
@@ -0,0 +1,40 @@
1
+ import { type Logger, type ToolDefinition } from '@ama-mcp/core';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import type { GithubToolOptions } from '../utils';
4
+ /**
5
+ * Options for the tool get_repositories_using_library
6
+ */
7
+ export interface GetRepositoriesUsingLibraryOptions extends GithubToolOptions, ToolDefinition {
8
+ /**
9
+ * Scopes to look for when searching for repositories
10
+ * (e.g. for @ama-mcp/github, the scope is ama-mcp)
11
+ * Limit to 10 scopes to avoid hitting GitHub search API rate limit
12
+ * @example ['ama-mcp', 'o3r']
13
+ */
14
+ scopes: string[];
15
+ /**
16
+ * Name of the library to look for in the dependencies
17
+ * @example 'Otter'
18
+ */
19
+ libraryName: string;
20
+ /**
21
+ * Path to cache the results
22
+ */
23
+ cachePath?: string;
24
+ /**
25
+ * Whether to use the cached results if available
26
+ */
27
+ disableCache?: boolean;
28
+ /**
29
+ * Maximum age in days of the cache for a repository to be considered valid
30
+ */
31
+ cacheMaxAge?: number;
32
+ }
33
+ /**
34
+ * Register the tool to get repositories using a configured library.
35
+ * @param server
36
+ * @param options
37
+ * @param logger
38
+ */
39
+ export declare function registerGetRepositoriesUsingLibraryTool(server: McpServer, options: GetRepositoriesUsingLibraryOptions, logger?: Logger): void;
40
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/find-repositories-using-library/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAOjD,OAAO,KAAK,EACV,iBAAiB,EAClB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,kCAAmC,SAAQ,iBAAiB,EAAE,cAAc;IAC3F;;;;;OAKG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+KD;;;;;GAKG;AACH,wBAAgB,uCAAuC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,kCAAkC,EAAE,MAAM,CAAC,EAAE,MAAM,QAoDtI"}
@@ -0,0 +1,206 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerGetRepositoriesUsingLibraryTool = registerGetRepositoriesUsingLibraryTool;
4
+ const node_fs_1 = require("node:fs");
5
+ const promises_1 = require("node:fs/promises");
6
+ const node_path_1 = require("node:path");
7
+ const core_1 = require("@ama-mcp/core");
8
+ const rest_1 = require("@octokit/rest");
9
+ const zod_1 = require("zod");
10
+ async function listRepos(octokit, options, logger) {
11
+ // We use several requests and not only one with OR
12
+ // because GitHub search API has some limitations in the query length and complexity
13
+ // Note: We can do only 10 searches per minute,
14
+ // so we should found another solution if we have more than 10 scopes to look for.
15
+ const search = (await Promise.allSettled(options.scopes
16
+ .map(async (scope) => {
17
+ const repos = (await octokit.paginate(octokit.search.code, { q: `@${scope}/ filename:package.json`, per_page: 100 }))
18
+ // eslint-disable-next-line @typescript-eslint/naming-convention -- Naming convention from GitHub API
19
+ .map(({ repository: { name, full_name, fork, archived, default_branch } }) => ({ name, full_name, fork, archived, default_branch }))
20
+ .filter((repo) => !repo.archived && !repo.fork);
21
+ logger?.info?.(`Found ${repos.length} repositories with references to @${scope} in package.json`);
22
+ return repos;
23
+ }))).filter((result) => result.status === 'fulfilled')
24
+ .flatMap((result) => result.value);
25
+ // Deduplicate repositories in case of multiple scopes matching the same repository
26
+ const repositories = Array.from(new Map(search.map((repo) => [repo.full_name, repo])).values());
27
+ logger?.info?.(`Found ${repositories.length} repositories with references to ${options.libraryName}`);
28
+ return repositories;
29
+ }
30
+ function findPackageJsonFiles(octokit) {
31
+ return async (repository) => {
32
+ const [owner, repo] = repository.full_name.split('/');
33
+ const { data: { commit: { sha } } } = await octokit.repos.getBranch({
34
+ owner,
35
+ repo,
36
+ branch: repository.default_branch || 'main'
37
+ });
38
+ const { data: { tree } } = await octokit.git.getTree({
39
+ owner,
40
+ repo,
41
+ tree_sha: sha
42
+ });
43
+ return tree.filter((t) => t.type === 'blob' && t.path.endsWith('package.json'));
44
+ };
45
+ }
46
+ function dependsOnLibrary(octokit, options) {
47
+ return async (repository, packageJsonPath) => {
48
+ const [owner, repo] = repository.full_name.split('/');
49
+ const { data } = await octokit.repos.getContent({
50
+ owner,
51
+ repo,
52
+ path: packageJsonPath
53
+ });
54
+ if (Array.isArray(data) || data.type !== 'file' || data.encoding !== 'base64') {
55
+ throw new Error('Unexpected content response structure');
56
+ }
57
+ const content = Buffer.from(data.content, 'base64').toString('utf8');
58
+ const packageJson = JSON.parse(content);
59
+ const scopeRegex = new RegExp(`^@(?:${options.scopes.join('|')})/`);
60
+ return [
61
+ ...Object.keys(packageJson.devDependencies || {}),
62
+ ...Object.keys(packageJson.dependencies || {})
63
+ ].some((dep) => scopeRegex.test(dep));
64
+ };
65
+ }
66
+ const DEFAULT_AMA_MCP_CACHE_MAX_AGE = 90;
67
+ const convertDaysToMs = (days) => days * 1000 * 60 * 60 * 24;
68
+ function validateCache(cachedRepos, options, logger) {
69
+ const now = Date.now();
70
+ const maxAge = convertDaysToMs(options.cacheMaxAge || DEFAULT_AMA_MCP_CACHE_MAX_AGE);
71
+ Object.entries(cachedRepos).forEach(([repo, { when }]) => {
72
+ const whenDate = new Date(when);
73
+ if (Number.isNaN(whenDate.getTime()) || (now - whenDate.getTime()) > maxAge) {
74
+ logger.info?.(`Cache for repository ${repo} is outdated or invalid, removing it`);
75
+ delete cachedRepos[repo];
76
+ }
77
+ });
78
+ }
79
+ async function findRepositoriesUsingLibrary(octokit, reposUsingLibrary, options, logger = core_1.logger) {
80
+ const { cachePath = (0, node_path_1.resolve)('.cache', '@ama-mcp', `repos-using-${options.libraryName.toLowerCase().replaceAll(/\s+/g, '-')}.json`), disableCache = false } = options;
81
+ let cachedRepos = {};
82
+ if (disableCache) {
83
+ logger?.info?.('Ignoring cached repositories as caching is disabled');
84
+ }
85
+ else {
86
+ try {
87
+ cachedRepos = JSON.parse(await (0, promises_1.readFile)(cachePath, { encoding: 'utf8' }));
88
+ validateCache(cachedRepos, options, logger);
89
+ reposUsingLibrary.push(...Object.entries(cachedRepos).filter(([, usesLibrary]) => usesLibrary).map(([repo]) => repo));
90
+ logger?.info?.(`Loaded ${Object.keys(cachedRepos).length} cached repositories, ${reposUsingLibrary.length} of them using ${options.libraryName} dependencies.`);
91
+ }
92
+ catch (e) {
93
+ logger?.info?.(`No cache file found, starting fresh search for repositories using ${options.libraryName} dependencies.`, e);
94
+ }
95
+ }
96
+ const repositories = (await listRepos(octokit, options)).filter((r) => !cachedRepos[r.full_name]?.dependsOn);
97
+ const findPackageJsonFilesInRepo = findPackageJsonFiles(octokit);
98
+ const dependsOnLibraryInRepo = dependsOnLibrary(octokit, options);
99
+ await Promise.allSettled(repositories.map(async (repository) => {
100
+ logger?.debug?.(`Checking repository ${repository.full_name}...`);
101
+ const packageJsonFiles = [];
102
+ try {
103
+ packageJsonFiles.push(...await findPackageJsonFilesInRepo(repository));
104
+ }
105
+ catch (e) {
106
+ logger?.warn?.(`Failed to list package.json files in repository ${repository.full_name}`, e);
107
+ }
108
+ if (packageJsonFiles.length === 0) {
109
+ logger?.info?.(`No package.json files found in repository ${repository.full_name}`);
110
+ cachedRepos[repository.full_name] = {
111
+ dependsOn: false,
112
+ when: new Date().toISOString()
113
+ };
114
+ return;
115
+ }
116
+ try {
117
+ await Promise.any(packageJsonFiles.map(async (packageJsonFile) => {
118
+ let depFound = false;
119
+ try {
120
+ depFound = await dependsOnLibraryInRepo(repository, packageJsonFile.path);
121
+ }
122
+ catch (e) {
123
+ logger?.error?.(`Failed to check package.json file at ${packageJsonFile.path} in repository ${repository.full_name}`, e);
124
+ }
125
+ if (depFound) {
126
+ reposUsingLibrary.push(repository.full_name);
127
+ logger?.info?.(`Repository ${repository.full_name} uses ${options.libraryName} dependencies`);
128
+ cachedRepos[repository.full_name] = {
129
+ dependsOn: true,
130
+ when: new Date().toISOString()
131
+ };
132
+ }
133
+ else {
134
+ throw new Error(`No ${options.libraryName} dependencies found in this package.json`);
135
+ }
136
+ }));
137
+ }
138
+ catch { }
139
+ cachedRepos[repository.full_name] ||= {
140
+ dependsOn: false,
141
+ when: new Date().toISOString()
142
+ };
143
+ }));
144
+ logger?.info?.(`Found ${reposUsingLibrary.length} repositories using ${options.libraryName} dependencies`);
145
+ if (disableCache) {
146
+ logger?.info?.('Not updating cache as caching is disabled');
147
+ }
148
+ else {
149
+ const cacheFolderPath = (0, node_path_1.dirname)(cachePath);
150
+ if (!(0, node_fs_1.existsSync)((0, node_path_1.dirname)(cacheFolderPath))) {
151
+ await (0, promises_1.mkdir)(cacheFolderPath, { recursive: true });
152
+ }
153
+ try {
154
+ await (0, promises_1.writeFile)(cachePath, JSON.stringify(cachedRepos));
155
+ }
156
+ catch (e) {
157
+ logger?.error?.('Failed to update cache', e);
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Register the tool to get repositories using a configured library.
163
+ * @param server
164
+ * @param options
165
+ * @param logger
166
+ */
167
+ function registerGetRepositoriesUsingLibraryTool(server, options, logger) {
168
+ const { githubToken, libraryName, toolName = `get_repositories_using_${options.libraryName.toLowerCase().replaceAll(/\s+/g, '_')}`, toolTitle = `Get repositories using ${options.libraryName} dependencies`, toolDescription = `List all repositories that use ${options.libraryName} dependencies (${options.scopes.map((scope) => `@${scope}`).join(' or ')}) in their package.json files.` } = options;
169
+ if (!githubToken) {
170
+ logger?.error?.(`Missing githubToken for ${toolName}`);
171
+ return;
172
+ }
173
+ const octokit = new rest_1.Octokit({ auth: githubToken });
174
+ let isLookingForRepos = true;
175
+ const reposUsingLibrary = [];
176
+ findRepositoriesUsingLibrary(octokit, reposUsingLibrary, options).catch((e) => {
177
+ logger?.error?.(`Error finding repositories using ${libraryName}:`, e);
178
+ });
179
+ isLookingForRepos = false;
180
+ server.registerTool(toolName, {
181
+ title: toolTitle,
182
+ description: toolDescription,
183
+ annotations: {
184
+ readOnlyHint: true,
185
+ openWorldHint: false
186
+ },
187
+ outputSchema: {
188
+ repositories: zod_1.z.array(zod_1.z.string()).describe(`List of repositories depending on ${libraryName}`)
189
+ }
190
+ }, () => ({
191
+ content: [
192
+ {
193
+ type: 'text',
194
+ text: (isLookingForRepos ? 'I did not finish to look for repositories. For the moment:\n' : '')
195
+ + reposUsingLibrary.length
196
+ ? `The following repositories use ${libraryName} dependencies:\n`
197
+ + reposUsingLibrary.sort().map((repo) => `- ${repo}`).join('\n')
198
+ : `No repositories found using ${libraryName} dependencies.`
199
+ }
200
+ ],
201
+ structuredContent: {
202
+ repositories: reposUsingLibrary
203
+ }
204
+ }));
205
+ }
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/find-repositories-using-library/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './find-repositories-using-library/index';
2
+ export * from './release-notes/index';
3
+ export * from './supported-releases/index';
4
+ //# sourceMappingURL=public_api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../src/public_api.ts"],"names":[],"mappings":"AAAA,cAAc,yCAAyC,CAAC;AACxD,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./find-repositories-using-library/index"), exports);
5
+ tslib_1.__exportStar(require("./release-notes/index"), exports);
6
+ tslib_1.__exportStar(require("./supported-releases/index"), exports);
7
+ //# sourceMappingURL=public_api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public_api.js","sourceRoot":"","sources":["../../src/public_api.ts"],"names":[],"mappings":";;;AAAA,kFAAwD;AACxD,gEAAsC;AACtC,qEAA2C"}
@@ -0,0 +1,24 @@
1
+ import { type Logger, ToolDefinition } from '@ama-mcp/core';
2
+ import { type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import type { GitHubRepositoryToolOptions } from '../utils';
4
+ /**
5
+ * Options for the tool to get release notes
6
+ */
7
+ export interface ReleaseNotesToolOptions extends GitHubRepositoryToolOptions, ToolDefinition {
8
+ /**
9
+ * Optional library name
10
+ */
11
+ libraryName?: string;
12
+ /**
13
+ * URI prefix for the resources
14
+ */
15
+ uriPrefix?: string;
16
+ }
17
+ /**
18
+ * Register the release notes tool and resources.
19
+ * @param server
20
+ * @param options
21
+ * @param logger
22
+ */
23
+ export declare function registerReleaseNotes(server: McpServer, options: ReleaseNotesToolOptions, logger?: Logger): Promise<void>;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/release-notes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EAEX,cAAc,EACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,SAAS,EAEf,MAAM,yCAAyC,CAAC;AAQjD,OAAO,KAAK,EACV,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,uBAAwB,SAAQ,2BAA2B,EAAE,cAAc;IAC1F;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgGD;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,GAAE,MAAsB,iBAe7H"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerReleaseNotes = registerReleaseNotes;
4
+ const core_1 = require("@ama-mcp/core");
5
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
6
+ const rest_1 = require("@octokit/rest");
7
+ const zod_1 = require("zod");
8
+ const getDefaultUriPrefix = (options) => options.libraryName || options.repo;
9
+ const getUri = (uriPrefix, tagName) => `${uriPrefix}://release-notes/${tagName}`;
10
+ const formatContent = (releaseNote) => `# ${releaseNote.tag_name}\n\n${releaseNote.body}`;
11
+ async function getReleaseNotes(octokit, options) {
12
+ const { owner, repo, uriPrefix = getDefaultUriPrefix(options) } = options;
13
+ const minorsReleaseNotes = (await octokit.paginate(octokit.repos.listReleases, { owner, repo }))
14
+ .filter((release) => /^v\d+\.\d+\.0$/.test(release.tag_name));
15
+ const releaseNotes = new Map(minorsReleaseNotes.map((releaseNote) => [releaseNote.tag_name, releaseNote]));
16
+ releaseNotes.forEach((value) => core_1.resourceRegistry.set(getUri(uriPrefix, value.tag_name), formatContent(value)));
17
+ return releaseNotes;
18
+ }
19
+ function registerReleaseNotesResources(server, releaseNotes, options) {
20
+ const { libraryName = `${options.owner}/${options.repo}`, uriPrefix = getDefaultUriPrefix(options) } = options;
21
+ server.registerResource(`${libraryName} release notes`, new mcp_js_1.ResourceTemplate(getUri(uriPrefix, '{tagName}'), {
22
+ list: undefined,
23
+ complete: {
24
+ tagName: (value) => {
25
+ const tagNames = Array.from(releaseNotes.keys());
26
+ return tagNames.filter((tagName) => tagName.startsWith(value));
27
+ }
28
+ }
29
+ }), {
30
+ description: `${libraryName}'s release notes`,
31
+ mimeType: 'text/markdown'
32
+ }, (uri, { tagName }) => ({
33
+ contents: (Array.isArray(tagName) ? tagName : [tagName])
34
+ .filter((tag) => !!releaseNotes.get(tag))
35
+ .map((tag) => ({
36
+ uri: uri.href,
37
+ text: core_1.resourceRegistry.get(getUri(uriPrefix, tag)),
38
+ mimeType: 'text/markdown'
39
+ }))
40
+ }));
41
+ }
42
+ function registerReleaseNotesTool(server, releaseNotes, options) {
43
+ const libraryName = options.libraryName || `${options.owner}/${options.repo}`;
44
+ const { toolName = `get_release_notes_${libraryName.toLowerCase().replaceAll(/\s+/g, '_')}`, toolDescription = `Get the release notes for the ${libraryName} releases`, toolTitle = `Get ${libraryName} release notes`, uriPrefix = getDefaultUriPrefix(options) } = options;
45
+ server.registerTool(toolName, {
46
+ title: toolTitle,
47
+ description: toolDescription,
48
+ annotations: {
49
+ readOnlyHint: true,
50
+ openWorldHint: false
51
+ },
52
+ inputSchema: {
53
+ version: zod_1.z.string().optional()
54
+ .describe('The version of the release notes to get, if not provided all release notes will be returned. Format to use is vX.Y.0, e.g. v13.1.0')
55
+ }
56
+ }, ({ version }) => {
57
+ const targetedReleaseNote = version && releaseNotes.get(version);
58
+ return {
59
+ content: (targetedReleaseNote ? [targetedReleaseNote] : Array.from(releaseNotes.values()))
60
+ .flatMap((releaseNote) => {
61
+ const uri = getUri(uriPrefix, releaseNote.tag_name);
62
+ return [{
63
+ type: 'text',
64
+ text: core_1.resourceRegistry.get(uri) || 'Not found'
65
+ }, {
66
+ type: 'resource_link',
67
+ name: `Release note ${releaseNote.tag_name}`,
68
+ uri
69
+ }];
70
+ })
71
+ };
72
+ });
73
+ }
74
+ /**
75
+ * Register the release notes tool and resources.
76
+ * @param server
77
+ * @param options
78
+ * @param logger
79
+ */
80
+ async function registerReleaseNotes(server, options, logger = core_1.logger) {
81
+ const { githubToken, libraryName = `${options.owner}/${options.repo}` } = options;
82
+ if (!githubToken) {
83
+ logger.error?.(`Missing githubToken for release notes tool and resources for ${libraryName}`);
84
+ return;
85
+ }
86
+ const octokit = new rest_1.Octokit({ auth: githubToken });
87
+ const releaseNotes = await getReleaseNotes(octokit, options);
88
+ logger.info?.(`Found ${releaseNotes.size} release notes for ${libraryName}`, releaseNotes);
89
+ registerReleaseNotesResources(server, releaseNotes, options);
90
+ registerReleaseNotesTool(server, releaseNotes, options);
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/release-notes/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type Logger, type ToolDefinition } from '@ama-mcp/core';
2
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import type { GitHubRepositoryToolOptions } from '../utils';
4
+ /**
5
+ * Options for the tool to get supported releases
6
+ */
7
+ export interface SupportedReleasesOptions extends ToolDefinition, GitHubRepositoryToolOptions {
8
+ /**
9
+ * Optional library name
10
+ */
11
+ libraryName?: string;
12
+ }
13
+ /**
14
+ * Register the supported releases tool.
15
+ * @param server
16
+ * @param options
17
+ * @param logger
18
+ */
19
+ export declare function registerSupportedReleasesTool(server: McpServer, options: SupportedReleasesOptions, logger?: Logger): Promise<void>;
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/supported-releases/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,cAAc,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACV,SAAS,EACV,MAAM,yCAAyC,CAAC;AAOjD,OAAO,KAAK,EACV,2BAA2B,EAC5B,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,cAAc,EAAE,2BAA2B;IAC3F;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAYD;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,wBAAwB,EAAE,MAAM,GAAE,MAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCvJ"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerSupportedReleasesTool = registerSupportedReleasesTool;
4
+ const core_1 = require("@ama-mcp/core");
5
+ const rest_1 = require("@octokit/rest");
6
+ const zod_1 = require("zod");
7
+ async function getSupportedReleases(octokit, options, logger) {
8
+ const { owner, repo } = options;
9
+ const supportedReleases = (await octokit.paginate(octokit.repos.listBranches, { owner, repo }))
10
+ .filter((branch) => /^release\/\d+\.\d+$/.test(branch.name))
11
+ .map((branch) => branch.name.replace('release/', ''));
12
+ logger.info?.(`Supported releases:\n${supportedReleases.map((r) => ` - ${r}`).join('\n')}`);
13
+ return supportedReleases;
14
+ }
15
+ /**
16
+ * Register the supported releases tool.
17
+ * @param server
18
+ * @param options
19
+ * @param logger
20
+ */
21
+ async function registerSupportedReleasesTool(server, options, logger = core_1.logger) {
22
+ const { githubToken, libraryName = `${options.owner}/${options.repo}`, toolName = `get_supported_releases_${libraryName.toLowerCase().replaceAll(/\s+/g, '_')}`, toolDescription = `Get the list of supported releases for ${libraryName}`, toolTitle = `Get Supported Releases for ${libraryName}` } = options;
23
+ if (!githubToken) {
24
+ logger.error?.(`Missing githubToken for ${toolName}`);
25
+ return;
26
+ }
27
+ const octokit = new rest_1.Octokit({ auth: githubToken });
28
+ const supportedReleases = await getSupportedReleases(octokit, options, logger);
29
+ server.registerTool(toolName, {
30
+ title: toolTitle,
31
+ description: toolDescription,
32
+ outputSchema: {
33
+ releases: zod_1.z.array(zod_1.z.string()).describe('List of supported releases')
34
+ }
35
+ }, () => {
36
+ return {
37
+ content: [
38
+ {
39
+ type: 'text',
40
+ text: `The supported releases for ${libraryName} are: \n${supportedReleases.map((r) => ` - ${r}`).join('\n')}`
41
+ }
42
+ ],
43
+ structuredContent: {
44
+ releases: supportedReleases
45
+ }
46
+ };
47
+ });
48
+ }
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/supported-releases/index.ts"],"names":[],"mappings":";;AA4CA,sEAuCC;AAnFD,wCAIuB;AAIvB,wCAEuB;AACvB,6BAEa;AAeb,KAAK,UAAU,oBAAoB,CAAC,OAAgB,EAAE,OAAiC,EAAE,MAAc;IACrG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,iBAAiB,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;SAC5F,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC3D,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;IAExD,MAAM,CAAC,IAAI,EAAE,CAAC,wBAAwB,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,6BAA6B,CAAC,MAAiB,EAAE,OAAiC,EAAE,SAAiB,aAAa;IACtI,MAAM,EACJ,WAAW,EACX,WAAW,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,EAChD,QAAQ,GAAG,0BAA0B,WAAW,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACxF,eAAe,GAAG,0CAA0C,WAAW,EAAE,EACzE,SAAS,GAAG,8BAA8B,WAAW,EAAE,EACxD,GAAG,OAAO,CAAC;IACZ,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,EAAE,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,MAAM,iBAAiB,GAAG,MAAM,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAE/E,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE;YACZ,QAAQ,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACrE;KACF,EACD,GAAG,EAAE;QACH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,8BAA8B,WAAW,WAAW,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAChH;aACF;YACD,iBAAiB,EAAE;gBACjB,QAAQ,EAAE,iBAAiB;aAC5B;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
package/src/utils.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ export interface GithubToolOptions {
2
+ /**
3
+ * GitHub authentication token
4
+ */
5
+ githubToken: string;
6
+ }
7
+ export interface GitHubRepositoryToolOptions extends GithubToolOptions {
8
+ /**
9
+ * GitHub repository owner
10
+ */
11
+ owner: string;
12
+ /**
13
+ * GitHub repository name
14
+ */
15
+ repo: string;
16
+ }
17
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd"}
package/src/utils.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":""}