Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ coverage/
*.swo
*~
.DS_Store
._*

# Runtime
*.pid
Expand Down
2 changes: 1 addition & 1 deletion src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export const MAX_QUERY_DOCUMENTS_TOP_K = 20;
export const QUERY_DOCUMENTS_MAX_CHUNKS = 500;

export const SERVER_NAME = 'Pinecone Read-Only MCP';
export const SERVER_VERSION = '0.1.0';
export { SERVER_VERSION } from './server-version.js';

export const SERVER_INSTRUCTIONS = `A semantic search server that provides hybrid search capabilities over Pinecone vector indexes with automatic namespace discovery.

Expand Down
57 changes: 57 additions & 0 deletions src/server-version.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
import { describe, expect, it } from 'vitest';
import { parsePackageJsonVersion, SERVER_VERSION } from './server-version.js';

function readRootPackageJson(): string {
const packageJsonPath = join(dirname(fileURLToPath(import.meta.url)), '..', 'package.json');
return readFileSync(packageJsonPath, 'utf8');
}

/**
* True when the server-reported version matches the package.json version.
* Returns false when the two strings differ (stale hardcoding or wrong file).
*/
function isServerVersionAligned(serverVersion: string, packageVersion: string): boolean {
return serverVersion === packageVersion;
}

/** Synthetic package.json bodies — only the `version` field matters for parsing. */
const PACKAGE_JSON_FIXTURES: readonly string[] = [
JSON.stringify({ name: 'a', version: '0.1.0' }),
JSON.stringify({ name: 'b', version: '1.0.0' }),
JSON.stringify({ version: '0.1.6', type: 'module' }),
JSON.stringify({ version: '2.3.4', private: true }),
];

describe('parsePackageJsonVersion', () => {
it('extracts version from several package.json shapes', () => {
expect(parsePackageJsonVersion(PACKAGE_JSON_FIXTURES[0])).toBe('0.1.0');
expect(parsePackageJsonVersion(PACKAGE_JSON_FIXTURES[1])).toBe('1.0.0');
expect(parsePackageJsonVersion(PACKAGE_JSON_FIXTURES[2])).toBe('0.1.6');
expect(parsePackageJsonVersion(PACKAGE_JSON_FIXTURES[3])).toBe('2.3.4');
});
});

describe('isServerVersionAligned', () => {
it('returns true when server and package versions are the same string', () => {
for (const raw of PACKAGE_JSON_FIXTURES) {
const v = parsePackageJsonVersion(raw);
expect(isServerVersionAligned(v, v)).toBe(true);
}
});

it('returns false when server and package versions differ', () => {
expect(isServerVersionAligned('0.1.0', '0.2.0')).toBe(false);
expect(isServerVersionAligned('1.0.0', '2.0.0')).toBe(false);
});
});

describe('SERVER_VERSION', () => {
it('matches the root package.json version (live module read)', () => {
const packageVersion = parsePackageJsonVersion(readRootPackageJson());
expect(isServerVersionAligned(SERVER_VERSION, packageVersion)).toBe(true);
expect(SERVER_VERSION).toBe(packageVersion);
});
});
23 changes: 23 additions & 0 deletions src/server-version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/**
* MCP server version — always matches the root package.json "version" field.
*/
import { readFileSync } from 'node:fs';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';

const __dirname = dirname(fileURLToPath(import.meta.url));
const packageJsonPath = join(__dirname, '..', 'package.json');

/**
* Read `version` from package.json text (same rules as the live server).
*/
export function parsePackageJsonVersion(raw: string, pathForErrors = 'package.json'): string {
const parsed = JSON.parse(raw) as { version?: unknown };
if (typeof parsed.version !== 'string' || parsed.version.length === 0) {
Comment thread
leostar0412 marked this conversation as resolved.
Outdated
throw new Error(`Invalid or missing "version" in ${pathForErrors}`);
}
return parsed.version;
}

const raw = readFileSync(packageJsonPath, 'utf8');
Comment thread
leostar0412 marked this conversation as resolved.
Outdated
export const SERVER_VERSION = parsePackageJsonVersion(raw, packageJsonPath);
Loading