#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
// Import tool definitions
import {
filesystemTools,
readFile,
writeFile,
appendFile,
deleteFile,
listDirectory,
createDirectory,
deleteDirectory,
getFileInfo,
moveFile,
copyFile,
readFileSchema,
writeFileSchema,
appendFileSchema,
deleteFileSchema,
listDirectorySchema,
createDirectorySchema,
deleteDirectorySchema,
getFileInfoSchema,
moveFileSchema,
copyFileSchema
} from './tools/filesystem.js';
import {
shellTools,
executeCommand,
executeStreamingCommand,
executeCommandSchema,
executeStreamingCommandSchema
} from './tools/shell.js';
import {
dockerTools,
dockerPs,
dockerLogs,
dockerExec,
dockerStart,
dockerStop,
dockerRestart,
dockerInspect,
dockerBuild,
dockerImages,
dockerPull,
dockerComposeUp,
dockerComposeDown,
dockerComposePs,
dockerComposeLogs,
dockerRm,
dockerRmi,
dockerPsSchema,
dockerLogsSchema,
dockerExecSchema,
dockerStartSchema,
dockerStopSchema,
dockerRestartSchema,
dockerInspectSchema,
dockerBuildSchema,
dockerImagesSchema,
dockerPullSchema,
dockerComposeUpSchema,
dockerComposeDownSchema,
dockerComposePsSchema,
dockerComposeLogsSchema,
dockerRmSchema,
dockerRmiSchema
} from './tools/docker.js';
import {
mongodbTools,
mongodbConnect,
mongodbFind,
mongodbFindOne,
mongodbInsertOne,
mongodbInsertMany,
mongodbUpdateOne,
mongodbUpdateMany,
mongodbDeleteOne,
mongodbDeleteMany,
mongodbAggregate,
mongodbCount,
mongodbCreateCollection,
mongodbDropCollection,
mongodbCreateIndex,
mongodbListIndexes,
mongodbDropIndex,
mongodbListDatabases,
mongodbListCollections,
mongodbStats,
mongodbConnectSchema,
mongodbFindSchema,
mongodbFindOneSchema,
mongodbInsertOneSchema,
mongodbInsertManySchema,
mongodbUpdateOneSchema,
mongodbUpdateManySchema,
mongodbDeleteOneSchema,
mongodbDeleteManySchema,
mongodbAggregateSchema,
mongodbCountSchema,
mongodbCreateCollectionSchema,
mongodbDropCollectionSchema,
mongodbCreateIndexSchema,
mongodbListIndexesSchema,
mongodbDropIndexSchema,
mongodbListDatabasesSchema,
mongodbListCollectionsSchema,
mongodbStatsSchema
} from './tools/mongodb.js';
import {
gitTools,
gitStatus,
gitAdd,
gitCommit,
gitDiff,
gitLog,
gitBranch,
gitCheckout,
gitPull,
gitPush,
gitClone,
gitInit,
gitMerge,
gitRebase,
gitFetch,
gitRemote,
gitStash,
gitReset,
gitRevert,
gitTag,
gitShow,
gitConfig,
gitStatusSchema,
gitAddSchema,
gitCommitSchema,
gitDiffSchema,
gitLogSchema,
gitBranchSchema,
gitCheckoutSchema,
gitPullSchema,
gitPushSchema,
gitCloneSchema,
gitInitSchema,
gitMergeSchema,
gitRebaseSchema,
gitFetchSchema,
gitRemoteSchema,
gitStashSchema,
gitResetSchema,
gitRevertSchema,
gitTagSchema,
gitShowSchema,
gitConfigSchema
} from './tools/git.js';
import { processTools } from './tools/process.js';
import {
networkTools,
httpRequest,
httpDownload,
httpHealthCheck,
networkPing,
networkPortCheck,
networkDnsLookup,
networkCurl,
networkNetstat,
networkTraceroute,
httpRequestSchema,
httpDownloadSchema,
httpHealthCheckSchema,
networkPingSchema,
networkPortCheckSchema,
networkDnsLookupSchema,
networkCurlSchema,
networkNetstatSchema,
networkTracerouteSchema
} from './tools/network.js';
import {
redisTools,
redisConnect,
redisGet,
redisSet,
redisDel,
redisExists,
redisKeys,
redisTtl,
redisExpire,
redisHset,
redisHget,
redisHgetall,
redisHdel,
redisLpush,
redisRpush,
redisLrange,
redisLpop,
redisSadd,
redisSmembers,
redisSrem,
redisIncr,
redisDecr,
redisFlushdb,
redisInfo,
redisDbsize,
redisConnectSchema,
redisGetSchema,
redisSetSchema,
redisDelSchema,
redisExistsSchema,
redisKeysSchema,
redisTtlSchema,
redisExpireSchema,
redisHsetSchema,
redisHgetSchema,
redisHgetallSchema,
redisHdelSchema,
redisLpushSchema,
redisRpushSchema,
redisLrangeSchema,
redisLpopSchema,
redisSaddSchema,
redisSmembersSchema,
redisSremSchema,
redisIncrSchema,
redisDecrSchema,
redisFlushdbSchema,
redisInfoSchema,
redisDbsizeSchema
} from './tools/redis.js';
/**
* MCP Server for Unrestricted Development Environment Access
*
* Provides AI with full access to:
* - Filesystem (read/write/delete)
* - Shell (unrestricted command execution with sudo)
* - Docker (container management)
* - MongoDB (database operations)
* - Git (version control)
* - Process management
* - Network operations
*/
class UnrestrictedDevServer {
private server: Server;
constructor() {
this.server = new Server(
{
name: 'unrestricted-dev-server',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
);
this.setupHandlers();
this.setupErrorHandling();
}
private setupErrorHandling(): void {
this.server.onerror = (error) => {
console.error('[MCP Error]', error);
};
process.on('SIGINT', async () => {
await this.server.close();
process.exit(0);
});
}
private setupHandlers(): void {
// List all available tools
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
...filesystemTools,
...shellTools,
...dockerTools,
...mongodbTools,
...redisTools,
...gitTools,
...processTools,
...networkTools
]
};
});
// Handle tool execution
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
// Filesystem tools
if (name === 'fs_read_file') {
const validated = readFileSchema.parse(args);
return await readFile(validated);
}
if (name === 'fs_write_file') {
const validated = writeFileSchema.parse(args);
return await writeFile(validated);
}
if (name === 'fs_append_file') {
const validated = appendFileSchema.parse(args);
return await appendFile(validated);
}
if (name === 'fs_delete_file') {
const validated = deleteFileSchema.parse(args);
return await deleteFile(validated);
}
if (name === 'fs_list_directory') {
const validated = listDirectorySchema.parse(args);
return await listDirectory(validated);
}
if (name === 'fs_create_directory') {
const validated = createDirectorySchema.parse(args);
return await createDirectory(validated);
}
if (name === 'fs_delete_directory') {
const validated = deleteDirectorySchema.parse(args);
return await deleteDirectory(validated);
}
if (name === 'fs_get_file_info') {
const validated = getFileInfoSchema.parse(args);
return await getFileInfo(validated);
}
if (name === 'fs_move_file') {
const validated = moveFileSchema.parse(args);
return await moveFile(validated);
}
if (name === 'fs_copy_file') {
const validated = copyFileSchema.parse(args);
return await copyFile(validated);
}
// Shell tools
if (name === 'shell_execute') {
const validated = executeCommandSchema.parse(args);
return await executeCommand(validated);
}
if (name === 'shell_execute_streaming') {
const validated = executeStreamingCommandSchema.parse(args);
return await executeStreamingCommand(validated);
}
// Git tools
if (name === 'git_status') {
const validated = gitStatusSchema.parse(args);
return await gitStatus(validated);
}
if (name === 'git_add') {
const validated = gitAddSchema.parse(args);
return await gitAdd(validated);
}
if (name === 'git_commit') {
const validated = gitCommitSchema.parse(args);
return await gitCommit(validated);
}
if (name === 'git_diff') {
const validated = gitDiffSchema.parse(args);
return await gitDiff(validated);
}
if (name === 'git_log') {
const validated = gitLogSchema.parse(args);
return await gitLog(validated);
}
if (name === 'git_branch') {
const validated = gitBranchSchema.parse(args);
return await gitBranch(validated);
}
if (name === 'git_checkout') {
const validated = gitCheckoutSchema.parse(args);
return await gitCheckout(validated);
}
if (name === 'git_pull') {
const validated = gitPullSchema.parse(args);
return await gitPull(validated);
}
if (name === 'git_push') {
const validated = gitPushSchema.parse(args);
return await gitPush(validated);
}
if (name === 'git_clone') {
const validated = gitCloneSchema.parse(args);
return await gitClone(validated);
}
if (name === 'git_init') {
const validated = gitInitSchema.parse(args);
return await gitInit(validated);
}
if (name === 'git_merge') {
const validated = gitMergeSchema.parse(args);
return await gitMerge(validated);
}
if (name === 'git_rebase') {
const validated = gitRebaseSchema.parse(args);
return await gitRebase(validated);
}
if (name === 'git_fetch') {
const validated = gitFetchSchema.parse(args);
return await gitFetch(validated);
}
if (name === 'git_remote') {
const validated = gitRemoteSchema.parse(args);
return await gitRemote(validated);
}
if (name === 'git_stash') {
const validated = gitStashSchema.parse(args);
return await gitStash(validated);
}
if (name === 'git_reset') {
const validated = gitResetSchema.parse(args);
return await gitReset(validated);
}
if (name === 'git_revert') {
const validated = gitRevertSchema.parse(args);
return await gitRevert(validated);
}
if (name === 'git_tag') {
const validated = gitTagSchema.parse(args);
return await gitTag(validated);
}
if (name === 'git_show') {
const validated = gitShowSchema.parse(args);
return await gitShow(validated);
}
if (name === 'git_config') {
const validated = gitConfigSchema.parse(args);
return await gitConfig(validated);
}
// Docker tools
if (name === 'docker_ps') {
const validated = dockerPsSchema.parse(args);
return await dockerPs(validated);
}
if (name === 'docker_logs') {
const validated = dockerLogsSchema.parse(args);
return await dockerLogs(validated);
}
if (name === 'docker_exec') {
const validated = dockerExecSchema.parse(args);
return await dockerExec(validated);
}
if (name === 'docker_start') {
const validated = dockerStartSchema.parse(args);
return await dockerStart(validated);
}
if (name === 'docker_stop') {
const validated = dockerStopSchema.parse(args);
return await dockerStop(validated);
}
if (name === 'docker_restart') {
const validated = dockerRestartSchema.parse(args);
return await dockerRestart(validated);
}
if (name === 'docker_inspect') {
const validated = dockerInspectSchema.parse(args);
return await dockerInspect(validated);
}
if (name === 'docker_build') {
const validated = dockerBuildSchema.parse(args);
return await dockerBuild(validated);
}
if (name === 'docker_images') {
const validated = dockerImagesSchema.parse(args);
return await dockerImages(validated);
}
if (name === 'docker_pull') {
const validated = dockerPullSchema.parse(args);
return await dockerPull(validated);
}
if (name === 'docker_compose_up') {
const validated = dockerComposeUpSchema.parse(args);
return await dockerComposeUp(validated);
}
if (name === 'docker_compose_down') {
const validated = dockerComposeDownSchema.parse(args);
return await dockerComposeDown(validated);
}
if (name === 'docker_compose_ps') {
const validated = dockerComposePsSchema.parse(args);
return await dockerComposePs(validated);
}
if (name === 'docker_compose_logs') {
const validated = dockerComposeLogsSchema.parse(args);
return await dockerComposeLogs(validated);
}
if (name === 'docker_rm') {
const validated = dockerRmSchema.parse(args);
return await dockerRm(validated);
}
if (name === 'docker_rmi') {
const validated = dockerRmiSchema.parse(args);
return await dockerRmi(validated);
}
// Network/HTTP tools
if (name === 'http_request') {
const validated = httpRequestSchema.parse(args);
return await httpRequest(validated);
}
if (name === 'http_download') {
const validated = httpDownloadSchema.parse(args);
return await httpDownload(validated);
}
if (name === 'http_health_check') {
const validated = httpHealthCheckSchema.parse(args);
return await httpHealthCheck(validated);
}
if (name === 'network_ping') {
const validated = networkPingSchema.parse(args);
return await networkPing(validated);
}
if (name === 'network_port_check') {
const validated = networkPortCheckSchema.parse(args);
return await networkPortCheck(validated);
}
if (name === 'network_dns_lookup') {
const validated = networkDnsLookupSchema.parse(args);
return await networkDnsLookup(validated);
}
if (name === 'network_curl') {
const validated = networkCurlSchema.parse(args);
return await networkCurl(validated);
}
if (name === 'network_netstat') {
const validated = networkNetstatSchema.parse(args);
return await networkNetstat(validated);
}
if (name === 'network_traceroute') {
const validated = networkTracerouteSchema.parse(args);
return await networkTraceroute(validated);
}
// MongoDB tools
if (name === 'mongodb_connect') {
const validated = mongodbConnectSchema.parse(args);
return await mongodbConnect(validated);
}
if (name === 'mongodb_find') {
const validated = mongodbFindSchema.parse(args);
return await mongodbFind(validated);
}
if (name === 'mongodb_find_one') {
const validated = mongodbFindOneSchema.parse(args);
return await mongodbFindOne(validated);
}
if (name === 'mongodb_insert_one') {
const validated = mongodbInsertOneSchema.parse(args);
return await mongodbInsertOne(validated);
}
if (name === 'mongodb_insert_many') {
const validated = mongodbInsertManySchema.parse(args);
return await mongodbInsertMany(validated);
}
if (name === 'mongodb_update_one') {
const validated = mongodbUpdateOneSchema.parse(args);
return await mongodbUpdateOne(validated);
}
if (name === 'mongodb_update_many') {
const validated = mongodbUpdateManySchema.parse(args);
return await mongodbUpdateMany(validated);
}
if (name === 'mongodb_delete_one') {
const validated = mongodbDeleteOneSchema.parse(args);
return await mongodbDeleteOne(validated);
}
if (name === 'mongodb_delete_many') {
const validated = mongodbDeleteManySchema.parse(args);
return await mongodbDeleteMany(validated);
}
if (name === 'mongodb_aggregate') {
const validated = mongodbAggregateSchema.parse(args);
return await mongodbAggregate(validated);
}
if (name === 'mongodb_count') {
const validated = mongodbCountSchema.parse(args);
return await mongodbCount(validated);
}
if (name === 'mongodb_create_collection') {
const validated = mongodbCreateCollectionSchema.parse(args);
return await mongodbCreateCollection(validated);
}
if (name === 'mongodb_drop_collection') {
const validated = mongodbDropCollectionSchema.parse(args);
return await mongodbDropCollection(validated);
}
if (name === 'mongodb_create_index') {
const validated = mongodbCreateIndexSchema.parse(args);
return await mongodbCreateIndex(validated);
}
if (name === 'mongodb_list_indexes') {
const validated = mongodbListIndexesSchema.parse(args);
return await mongodbListIndexes(validated);
}
if (name === 'mongodb_drop_index') {
const validated = mongodbDropIndexSchema.parse(args);
return await mongodbDropIndex(validated);
}
if (name === 'mongodb_list_databases') {
const validated = mongodbListDatabasesSchema.parse(args);
return await mongodbListDatabases(validated);
}
if (name === 'mongodb_list_collections') {
const validated = mongodbListCollectionsSchema.parse(args);
return await mongodbListCollections(validated);
}
if (name === 'mongodb_stats') {
const validated = mongodbStatsSchema.parse(args);
return await mongodbStats(validated);
}
// Redis tools
if (name === 'redis_connect') {
const validated = redisConnectSchema.parse(args);
return await redisConnect(validated);
}
if (name === 'redis_get') {
const validated = redisGetSchema.parse(args);
return await redisGet(validated);
}
if (name === 'redis_set') {
const validated = redisSetSchema.parse(args);
return await redisSet(validated);
}
if (name === 'redis_del') {
const validated = redisDelSchema.parse(args);
return await redisDel(validated);
}
if (name === 'redis_exists') {
const validated = redisExistsSchema.parse(args);
return await redisExists(validated);
}
if (name === 'redis_keys') {
const validated = redisKeysSchema.parse(args);
return await redisKeys(validated);
}
if (name === 'redis_ttl') {
const validated = redisTtlSchema.parse(args);
return await redisTtl(validated);
}
if (name === 'redis_expire') {
const validated = redisExpireSchema.parse(args);
return await redisExpire(validated);
}
if (name === 'redis_hset') {
const validated = redisHsetSchema.parse(args);
return await redisHset(validated);
}
if (name === 'redis_hget') {
const validated = redisHgetSchema.parse(args);
return await redisHget(validated);
}
if (name === 'redis_hgetall') {
const validated = redisHgetallSchema.parse(args);
return await redisHgetall(validated);
}
if (name === 'redis_hdel') {
const validated = redisHdelSchema.parse(args);
return await redisHdel(validated);
}
if (name === 'redis_lpush') {
const validated = redisLpushSchema.parse(args);
return await redisLpush(validated);
}
if (name === 'redis_rpush') {
const validated = redisRpushSchema.parse(args);
return await redisRpush(validated);
}
if (name === 'redis_lrange') {
const validated = redisLrangeSchema.parse(args);
return await redisLrange(validated);
}
if (name === 'redis_lpop') {
const validated = redisLpopSchema.parse(args);
return await redisLpop(validated);
}
if (name === 'redis_sadd') {
const validated = redisSaddSchema.parse(args);
return await redisSadd(validated);
}
if (name === 'redis_smembers') {
const validated = redisSmembersSchema.parse(args);
return await redisSmembers(validated);
}
if (name === 'redis_srem') {
const validated = redisSremSchema.parse(args);
return await redisSrem(validated);
}
if (name === 'redis_incr') {
const validated = redisIncrSchema.parse(args);
return await redisIncr(validated);
}
if (name === 'redis_decr') {
const validated = redisDecrSchema.parse(args);
return await redisDecr(validated);
}
if (name === 'redis_flushdb') {
const validated = redisFlushdbSchema.parse(args);
return await redisFlushdb(validated);
}
if (name === 'redis_info') {
const validated = redisInfoSchema.parse(args);
return await redisInfo(validated);
}
if (name === 'redis_dbsize') {
const validated = redisDbsizeSchema.parse(args);
return await redisDbsize(validated);
}
// TODO: Implement handlers for process tools
throw new Error(`Unknown tool: ${name}`);
} catch (error) {
if (error instanceof Error) {
return {
content: [
{
type: 'text' as const,
text: JSON.stringify({
success: false,
error: error.message,
stack: error.stack
}, null, 2)
}
],
isError: true
};
}
throw error;
}
});
}
async run(): Promise<void> {
const transport = new StdioServerTransport();
await this.server.connect(transport);
console.error('Unrestricted Dev MCP Server running on stdio');
}
}
// Start the server
const server = new UnrestrictedDevServer();
server.run().catch(console.error);