Skip to content

Commit 972de16

Browse files
committed
Add winston logger for improved error handling and logging
1 parent e69419d commit 972de16

File tree

2 files changed

+45
-20
lines changed

2 files changed

+45
-20
lines changed

build/index.js

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,20 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
33
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
44
import { z } from "zod";
55
import fetch from 'node-fetch';
6+
import winston from 'winston';
7+
// Configure winston logger
8+
const logger = winston.createLogger({
9+
level: 'info',
10+
format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.json()),
11+
transports: [
12+
new winston.transports.File({ filename: 'socket-mcp-error.log', level: 'error' }),
13+
new winston.transports.File({ filename: 'socket-mcp.log' })
14+
]
15+
});
616
const SOCKET_API_URL = "https://api.socket.dev/v0/purl?alerts=false&compact=false&fixable=false&licenseattrib=false&licensedetails=false";
717
const SOCKET_API_KEY = process.env.SOCKET_API_KEY || "";
818
if (!SOCKET_API_KEY) {
9-
console.error("Error: SOCKET_API_KEY environment variable is not set");
19+
logger.error("SOCKET_API_KEY environment variable is not set");
1020
process.exit(1);
1121
}
1222
const SOCKET_HEADERS = {
@@ -24,20 +34,20 @@ const server = new McpServer({
2434
tools: {},
2535
},
2636
});
27-
server.tool("depscore", "Get the dependency score of a package with the `depscore` tool from Socket. Use 'unknown' for version if not known.", {
37+
server.tool("depscore", "Get the dependency score of a package with the `depscore` tool from Socket. Use 'unknown' for version if not known. Use this tool to scan dependencies for their quality and security on existing code or when code is generated.", {
2838
ecosystem: z.string().describe("The package ecosystem (e.g., npm, pypi)").default("npm"),
2939
depname: z.string().describe("The name of the dependency"),
3040
version: z.string().describe("The version of the dependency, use 'unknown' if not known").default("unknown"),
3141
}, async ({ ecosystem, depname, version }) => {
32-
console.log(`Received request for ${depname} (${version}) in ${ecosystem} ecosystem`);
42+
logger.info(`Received request for ${depname} (${version}) in ${ecosystem} ecosystem`);
3343
// cleanup version
3444
let purl;
3545
const cleanedVersion = version.replace(/[\^~]/g, ''); // Remove ^ and ~ from version
3646
if (cleanedVersion === "1.0.0" || cleanedVersion === "unknown" || !cleanedVersion) {
3747
purl = `pkg:${ecosystem}/${depname}`;
3848
}
3949
else {
40-
console.log(`Using version ${cleanedVersion} for ${depname}`);
50+
logger.info(`Using version ${cleanedVersion} for ${depname}`);
4151
purl = `pkg:${ecosystem}/${depname}@${cleanedVersion}`;
4252
}
4353
try {
@@ -50,15 +60,15 @@ server.tool("depscore", "Get the dependency score of a package with the `depscor
5060
const responseText = await response.text();
5161
if (response.status !== 200) {
5262
const errorMsg = `Error processing ${purl}: [${response.status}] ${responseText}`;
53-
console.error(errorMsg);
63+
logger.error(errorMsg);
5464
return {
5565
content: [{ type: "text", text: errorMsg }],
5666
isError: false
5767
};
5868
}
5969
else if (!responseText.trim()) {
6070
const errorMsg = `${purl} was not found.`;
61-
console.error(errorMsg);
71+
logger.error(errorMsg);
6272
return {
6373
content: [{ type: "text", text: errorMsg }],
6474
isError: false
@@ -112,7 +122,7 @@ server.tool("depscore", "Get the dependency score of a package with the `depscor
112122
catch (e) {
113123
const error = e;
114124
const errorMsg = `JSON parsing error for ${purl}: ${error.message} -- Response: ${responseText}`;
115-
console.error(errorMsg);
125+
logger.error(errorMsg);
116126
const llmResponse = `Package ${purl} not found.`;
117127
return {
118128
content: [{ type: "text", text: llmResponse }],
@@ -123,7 +133,7 @@ server.tool("depscore", "Get the dependency score of a package with the `depscor
123133
catch (e) {
124134
const error = e;
125135
const errorMsg = `Error processing ${purl}: ${error.message}`;
126-
console.error(errorMsg);
136+
logger.error(errorMsg);
127137
const llmResponse = `Package ${purl} not found.`;
128138
return {
129139
content: [{ type: "text", text: llmResponse }],
@@ -135,9 +145,9 @@ server.tool("depscore", "Get the dependency score of a package with the `depscor
135145
const transport = new StdioServerTransport();
136146
server.connect(transport)
137147
.then(() => {
138-
console.log("Socket MCP server started successfully");
148+
logger.info("Socket MCP server started successfully");
139149
})
140150
.catch((error) => {
141-
console.error(`Failed to start Socket MCP server: ${error.message}`);
151+
logger.error(`Failed to start Socket MCP server: ${error.message}`);
142152
process.exit(1);
143153
});

src/index.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,27 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
33
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
44
import { z } from "zod";
55
import fetch from 'node-fetch';
6+
import winston from 'winston';
7+
8+
// Configure winston logger
9+
const logger = winston.createLogger({
10+
level: 'info',
11+
format: winston.format.combine(
12+
winston.format.timestamp(),
13+
winston.format.errors({ stack: true }),
14+
winston.format.json()
15+
),
16+
transports: [
17+
new winston.transports.File({ filename: 'socket-mcp-error.log', level: 'error' }),
18+
new winston.transports.File({ filename: 'socket-mcp.log' })
19+
]
20+
});
621

722
const SOCKET_API_URL = "https://api.socket.dev/v0/purl?alerts=false&compact=false&fixable=false&licenseattrib=false&licensedetails=false";
823

924
const SOCKET_API_KEY = process.env.SOCKET_API_KEY || "";
1025
if (!SOCKET_API_KEY) {
11-
console.error("Error: SOCKET_API_KEY environment variable is not set");
26+
logger.error("SOCKET_API_KEY environment variable is not set");
1227
process.exit(1);
1328
}
1429

@@ -31,22 +46,22 @@ const server = new McpServer({
3146

3247
server.tool(
3348
"depscore",
34-
"Get the dependency score of a package with the `depscore` tool from Socket. Use 'unknown' for version if not known.",
49+
"Get the dependency score of a package with the `depscore` tool from Socket. Use 'unknown' for version if not known. Use this tool to scan dependencies for their quality and security on existing code or when code is generated.",
3550
{
3651
ecosystem: z.string().describe("The package ecosystem (e.g., npm, pypi)").default("npm"),
3752
depname: z.string().describe("The name of the dependency"),
3853
version: z.string().describe("The version of the dependency, use 'unknown' if not known").default("unknown"),
3954
},
4055
async ({ ecosystem, depname, version }) => {
41-
console.log(`Received request for ${depname} (${version}) in ${ecosystem} ecosystem`);
56+
logger.info(`Received request for ${depname} (${version}) in ${ecosystem} ecosystem`);
4257

4358
// cleanup version
4459
let purl: string;
4560
const cleanedVersion = version.replace(/[\^~]/g, ''); // Remove ^ and ~ from version
4661
if (cleanedVersion === "1.0.0" || cleanedVersion === "unknown" || !cleanedVersion) {
4762
purl = `pkg:${ecosystem}/${depname}`;
4863
} else {
49-
console.log(`Using version ${cleanedVersion} for ${depname}`);
64+
logger.info(`Using version ${cleanedVersion} for ${depname}`);
5065
purl = `pkg:${ecosystem}/${depname}@${cleanedVersion}`;
5166
}
5267

@@ -62,14 +77,14 @@ server.tool(
6277

6378
if (response.status !== 200) {
6479
const errorMsg = `Error processing ${purl}: [${response.status}] ${responseText}`;
65-
console.error(errorMsg);
80+
logger.error(errorMsg);
6681
return {
6782
content: [{ type: "text", text: errorMsg }],
6883
isError: false
6984
};
7085
} else if (!responseText.trim()) {
7186
const errorMsg = `${purl} was not found.`;
72-
console.error(errorMsg);
87+
logger.error(errorMsg);
7388
return {
7489
content: [{ type: "text", text: errorMsg }],
7590
isError: false
@@ -126,7 +141,7 @@ server.tool(
126141
} catch (e) {
127142
const error = e as Error;
128143
const errorMsg = `JSON parsing error for ${purl}: ${error.message} -- Response: ${responseText}`;
129-
console.error(errorMsg);
144+
logger.error(errorMsg);
130145
const llmResponse = `Package ${purl} not found.`;
131146
return {
132147
content: [{ type: "text", text: llmResponse }],
@@ -136,7 +151,7 @@ server.tool(
136151
} catch (e) {
137152
const error = e as Error;
138153
const errorMsg = `Error processing ${purl}: ${error.message}`;
139-
console.error(errorMsg);
154+
logger.error(errorMsg);
140155
const llmResponse = `Package ${purl} not found.`;
141156
return {
142157
content: [{ type: "text", text: llmResponse }],
@@ -151,9 +166,9 @@ server.tool(
151166
const transport = new StdioServerTransport();
152167
server.connect(transport)
153168
.then(() => {
154-
console.log("Socket MCP server started successfully");
169+
logger.info("Socket MCP server started successfully");
155170
})
156171
.catch((error: Error) => {
157-
console.error(`Failed to start Socket MCP server: ${error.message}`);
172+
logger.error(`Failed to start Socket MCP server: ${error.message}`);
158173
process.exit(1);
159174
});

0 commit comments

Comments
 (0)