ウィークリーレポ:2025/10/20

先週は生成AIの解析ができるか全力でClaude Codeを廻していたのでこれと言ってレポートできる内容が少ない

CD8180

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環境

新規環境だとついつい、npm環境をroot環境に入れてしまうのでユーザー環境へ移行する。

nvmのインストール

https://github.com/nvm-sh/nvm

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

バージョン確認

nvm -v
0.40.3

nodeのインストール

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のバージョン確認

node -v
v24.10.0

npmのバージョン確認

npm -v
11.6.1

npmのパッケージインストール

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

ぼちぼちとnanocoderでAIエージェント環境を整えようとしている。

https://github.com/Nano-Collective/nanocoder

つぎのMCP Serverサンプルに続く。

MCP Serverサンプル

nanocoderで動作するMCPサーバーを作成する。

今回はサンプルを作成する程度。

npmのセットアップ

npm install
npm list @modelcontextprotocol/sdk

mcp-server-minimal.js

#!/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();

agent.config.json

{
  "nanocoder": {
    "mcpServers": [
      {
        "name": "qa-knowledge",
        "command": "node",
        "args": [
          "/home/hidemi/nanocoder_sample/mcp-server-minimal.js"
        ],
        "env": {
          "NODE_ENV": "production"
        }
      }
    ]
  }
}