先週は生成AIの解析ができるか全力でClaude Codeを廻していたのでこれと言ってレポートできる内容が少ない
CIXのCD8180が実装された基板が出始めた。
このデバイスは30TOPSのNPUを積んでいて、CPU+GPU+NPUで45TOPSの性能があるらしい。
メモリも32GBで小さなLLMサーバとして利用できるのではないかと模索している。
Orionは約30,000円、Orange Piが約39,000円ぐらいの価格帯だ。
性能は30TOPSなのでHAILOと同じぐらいだと思えばいいんだけど、コンパクトに収まっているからいいなぁという感じ。
ハード面では性能があると言っても問題はNPUのSDKが整っているかというところだ。
NeuralOne AI SDKというSDKが用意されているようだが、扱いはEarly Accessのようでまだまだというところなのだろうか?
新規環境だとついつい、npm環境をroot環境に入れてしまうのでユーザー環境へ移行する。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash
nvm -v
0.40.3
nvm install 24
Downloading and installing node v24.10.0...
Downloading https://nodejs.org/dist/v24.10.0/node-v24.10.0-linux-x64.tar.xz...
################################################################################################################# 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v24.10.0 (npm v11.6.1)
node -v
v24.10.0
npm -v
11.6.1
npm install -g @nanocollective/nanocoder
npm install -g @anthropic-ai/claude-code
npm install -g @google/gemini-cli
npm install -g @openai/codex
npm install -g @forge/cli
npm install -g @github/copilot
npm install -g opencode-ai
ぼちぼちとnanocoderでAIエージェント環境を整えようとしている。
https://github.com/Nano-Collective/nanocoder
つぎのMCP Serverサンプルに続く。
nanocoderで動作するMCPサーバーを作成する。
今回はサンプルを作成する程度。
npm install
npm list @modelcontextprotocol/sdk
#!/usr/bin/env node
/**
* 最小限のMCPサーバー - デバッグ用
* 必要最低限の機能のみを実装
*/
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
// ログ関数(必ずstderrに出力)
function log(message) {
process.stderr.write(`[${new Date().toISOString()}] ${message}\n`);
}
// サーバーインスタンスを作成
const server = new Server(
{
name: "minimal-qa-server",
version: "1.0.0",
},
{
capabilities: {
tools: {},
},
}
);
// ツール一覧を返す
server.setRequestHandler(ListToolsRequestSchema, async () => {
log("tools/list called");
return {
tools: [
{
name: "greet",
description: "シンプルな挨拶ツール",
inputSchema: {
type: "object",
properties: {
name: {
type: "string",
description: "名前",
},
},
required: ["name"],
},
},
],
};
});
// ツール実行
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
log(`tools/call called: ${name}`);
if (name === "greet") {
return {
content: [
{
type: "text",
text: `こんにちは、${args.name}さん!`,
},
],
};
}
throw new Error(`Unknown tool: ${name}`);
});
// エラーハンドリング
process.on('uncaughtException', (error) => {
log(`Uncaught exception: ${error.message}`);
log(error.stack || '');
});
process.on('unhandledRejection', (reason) => {
log(`Unhandled rejection: ${reason}`);
});
// シャットダウン処理
let isShuttingDown = false;
async function shutdown() {
if (isShuttingDown) return;
isShuttingDown = true;
log('Shutting down...');
try {
await server.close();
log('Server closed successfully');
} catch (error) {
log(`Error during shutdown: ${error.message}`);
}
process.exit(0);
}
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
// メイン処理
async function main() {
try {
log('=== Starting Minimal MCP Server ===');
log(`Node version: ${process.version}`);
log(`Platform: ${process.platform}`);
// トランスポートを作成
const transport = new StdioServerTransport();
log('Transport created');
// サーバーに接続
await server.connect(transport);
log('Server connected successfully');
// 重要: プロセスを維持
process.stdin.resume();
log('Server is ready and listening...');
} catch (error) {
log(`Fatal error: ${error.message}`);
log(error.stack || '');
process.exit(1);
}
}
// 起動
main();
{
"nanocoder": {
"mcpServers": [
{
"name": "qa-knowledge",
"command": "node",
"args": [
"/home/hidemi/nanocoder_sample/mcp-server-minimal.js"
],
"env": {
"NODE_ENV": "production"
}
}
]
}
}