0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本稿に記載した内容は、個人的な見解を示したものであり、筆者の所属する企業・団体の公式見解ではありません。
本記事はCybozu/kintone との提携・後援を意味しません。

概要

本記事は、kintone MCP(Model Context Protocol)Gemini CLI から呼び出し、自然言語だけで kintone アプリの操作と簡単な運用タスクをどこまで自動化できるかを検証した検証メモです。アプリ一覧取得・レコード取得/追加/更新・条件抽出・一括更新・集計(サマリー)・欠損データの洗い出し、さらにアプリ設定の変更(フィールド追加と計算式) までを、一連のプロンプトで実施しました。

  • 本記事でわかること:

    • Gemini CLI での MCP サーバ登録手順と動作確認の流れ
       * MCP 経由で実行できる kintone 操作の実例
    • つまずき事例とリカバリーの勘所

なお、API 仕様の詳細解説やセキュリティ/性能のチューニングは範囲外です。ここでは「どこまで対話で任せられるか」にフォーカスし、得られた知見を端的にまとめています。

前提

  • LLM
    • Model: gemini-2.5-pro
    • Client: Gemini CLI 0.7.0

  • Platform
    • OS: Windows 11 24H2
    • Shell: PowerShell 7.5.3 (pwsh)
    • Container: Docker 28.4.0 (build d8eb465)
    • Runtime: Node.js v22.17.1
    • Package manager: npm 11.6.1

事前準備

kintone MCPのインストール

kintone MCP Server READMEに従ってMCPサーバーをインストールします。

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

dxtでのインストールの方が簡単そうなのですが、Claudeに課金をしていない(高すぎる)のでGemini CLIを使うためにnpmでインストールします。

Powershell
PS > npm install -g @kintone/mcp-server

added 116 packages in 6s

29 packages are looking for funding
  run `npm fund` for details

Gemini CLIのコンフィグファイルを編集

Gemini CLIのコンフィグファイルにmcpサーバーを登録します。READMEの中の例示とは多少違う点に注意です。

%USERPROFILE%\.gemini\config.json(デフォルト)
{
  "security": {
    "auth": {
      "selectedType": "oauth-personal"
    }
  }
}
%USERPROFILE%\.gemini\config.json(変更後)
{
  "security": {
    "auth": {
      "selectedType": "oauth-personal"
    }
  },
  "mcpServers": {
    "kintone": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "KINTONE_BASE_URL",
        "-e",
        "KINTONE_USERNAME",
        "-e",
        "KINTONE_PASSWORD",
        "ghcr.io/kintone/mcp-server:latest"
      ],
      "env": {
        "KINTONE_BASE_URL": "https://example.cybozu.com",
        "KINTONE_USERNAME": "username",
        "KINTONE_PASSWORD": "password"
      }
    }
  }
}

Gemini CLIの起動とインストールの確認

Gemini CLIを起動し、/mcp listと入力するとリストが表示されます。これでインストールは完了です。

/mcp list
╭───────────────╮
│  > /mcp list  │
╰───────────────╯


ℹConfigured MCP servers:

  🟢 kintone - Ready (19 tools)
    Tools:
    - kintone-add-app
    - kintone-add-form-fields
    - kintone-add-records
    - kintone-delete-form-fields
    - kintone-delete-records
    - kintone-deploy-app
    - kintone-download-file
    - kintone-get-app
    - kintone-get-app-deploy-status
    - kintone-get-apps
    - kintone-get-form-fields
    - kintone-get-form-layout
    - kintone-get-general-settings
    - kintone-get-process-management
    - kintone-get-records
    - kintone-update-form-fields
    - kintone-update-general-settings
    - kintone-update-records
    - kintone-update-statuses


  💡 Tips:
    • Use /mcp desc to show server and tool descriptions
    • Use /mcp schema to show tool parameter schemas
    • Use /mcp nodesc to hide descriptions
    • Use /mcp auth <server-name> to authenticate with OAuth-enabled servers
    • Press Ctrl+T to toggle tool descriptions on/off

インストールの失敗談

READMEの設定ファイルをそのままコピーすると以下のエラーが出てしまいます。

Powershell
 MCP ERROR (kintone): Error: spawn C:\WINDOWS\system32\cmd.exe ENOENT
 Error during discovery for server 'kintone': spawn C:\WINDOWS\system32\cmd.exe ENOENT

デプロイ失敗の原因

Gemini CLI は MCP サーバーを子プロセスとして起動します。Windows では、コマンドの種類によって cmd.exe を仲介して起動されることがあります(.cmd シム実行・シェル経由など)。

cwd に存在しないフォルダを渡すと、OS のプロセス起動が前段階で失敗し、Node.js からは
「起動しようとしていた実行ファイル名(ここでは cmd.exe)付きの ENOENT」 として見えます。
→ メッセージは cmd.exe ENOENT でも、真因は cwd 不正、ということがあるわけです。

解決策

設定ファイル内で記載されている"cwd": "${cwd}"を削除する。

  • cwd未指定 or 実在する絶対パス。相対なら "." を明示しましょう。
  • 環境変数やテンプレートの自動展開は無い前提で書きましょう。

アプリの作成

操作される側のkintoneアプリケーションも用意しないといけません。テストとしてkintone側には「日報」、「案件管理」を作成しておきました。「案件管理」アプリにはテスト用例示レコードがあるので、この辺を使って検証していきたいと思います。

image.png

image.png

アプリケーションの確認

アプリケーションの一覧を取得し、アプリケーションIDを取得するタスクを与えます。想定通り遂行してくれました。

プロンプト
> アプリケーションの一覧とアプリケーションのIDを表形式で表示して
回答
✦ はい、承知いたしました。
  kintone内のアプリケーションとアプリケーションIDの一覧ですね。
  まず、アプリケーションの一覧を取得します。

回答

✦ はい、アプリの一覧が取得できましたので、表形式で表示します。
アプリケーション名 アプリケーションID
日報 2
案件管理 3

レコードの取得

アプリケーションを指定して、単純にレコードを取得するタスクを与えます。想定通り遂行してくれました。

プロンプト
> 案件管理のアプリケーションのレコードを全て表形式で表示して
回答
✦ はい、承知いたしました。
  案件管理アプリの全レコードを取得し、表形式で表示します。

回答
✦ はい、案件管理アプリの全レコードを取得しました。
  情報を見やすくするため、主要な項目を抜粋して表形式で表示します。
レコード番号 会社名 先方担当者 製品名 確度 小計
20 田中マーケティングテクノロジー 田中 浩二 kintone A 45,000
19 山田商事株式会社 山田 貴文 Office B 300,000
18 ヴィクトリーフィールド株式会社 松井 義昭 Garoon A 400,000
17 ヤマシタ実業株式会社 山上 肇 kintone B 75,000
16 石井精密機械工業 石井 太郎 Office C 80,000
15 マネープラットフォーム株式会社 田中 浩二 Office B 80,000
14 株式会社ワホー 山田 雅子 kintone A 75,000
13 メディカルアライアンス株式会社 佐藤 正義 kintone C 150,000
12 東邦ホームズ 田中 浩二 kintone B 570,000
11 吉高ビューティ 吉高 美智子 Office A 10,000
10 サイト商事株式会社 斎藤 直樹 kintone A 22,500
9 自然食品ウッディータウン 田中 浩二 kintone B 22,500
8 株式会社ひふみファイナンス 護国 冴子 Garoon A 640,000
7 いつみ工業株式会社 吉澤 敏夫 kintone A 75,000
6 稲光水産 稲光 道信 Garoon C 240,000
5 株式会社KK情報システム 小田桐 大地 kintone C 750,000
4 有限会社HAYABUSA 池田 翔太 kintone A 7,500
3 山崎自動車教習所 山田 健介 kintone A 3,900
2 はんなりフーズ株式会社 東坂本 裕次郎 kintone B 225,000
1 株式会社エイト食品 小林 学 kintone A 3,000,000

レコードの追加

アプリケーションを指定して、単純にレコードを追加するタスクを与えます。想定通り遂行してくれました。

プロンプト
> 「案件管理」のアプリケーションに以下のデータを追加して 
  山根コンベア                                           
  山根たかし                                             
  2024-01-10                                             
  B                                                      
  Garoon                                                 
  800                                                    
  100                                                    
  80000    
回答
✦ 承知いたしました。案件管理アプリに新しいレコードを追加します。
  以下の内容でよろしいでしょうか?


   * 会社名: 山根コンベア
  上記内容でレコードを追加します。
 ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
 │ ✓  kintone-add-records (kintone MCP Server) {"app":"3","records":[{"ラジオボタン":{"value":"B"},"文字列__1…   │
 │                                                                                                              │
 │    {                                                                                                         │
 │      "ids": [                                                                                                │
 │        "21"                                                                                                  │
 │      ],                                                                                                      │
 │      "revisions": [                                                                                          │
 │        "1"                                                                                                   │
 │      ]                                                                                                       │
 │    }                                                                                                         │
 ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
✦ レコードの追加が完了しました。
  新しいレコードのIDは「21」です。

image.png

レコードをフィルターして取得

レコードを取得する際にフィルター条件を加えて取得するタスクを与えます。想定通り遂行してくれました。

プロンプト
> 先方担当者が田中 浩二のレコードを全て取得し、表形式で出力してください。
回答
✦ はい、承知いたしました。
  案件管理アプリから、先方担当者が「田中 浩二」のレコードを全て取得し、表形式で表示します。
  
回答

✦ はい、担当者が「田中 浩二」のレコードを4件見つけました。以下に表形式で表示します。

レコード番号 会社名 製品名 確度 小計
20 田中マーケティングテクノロジー kintone A 45,000
15 マネープラットフォーム株式会社 Office B 80,000
12 東邦ホームズ kintone B 570,000
9 自然食品ウッディータウン kintone B 22,500

レコードの更新

既にあるレコードの一部を更新するタスクを与えます。田中マーケティングテクノロジーの確度をAからBに変更してもらいます。想定通り遂行してくれました。

プロンプト
> 案件管理のアプリケーションの田中マーケティングテクノロジーの確度がBになりました。
レコードを更新してください。
回答
✦ はい、承知いたしました。
  案件管理アプリで、「田中マーケティングテクノロジー」のレコードの確度を「B」に更新します。

  まず、該当のレコードを検索して、レコードIDを取得します。

回答

✦ レコードが見つかりました。レコードIDは「20」です。
  このレコードの「確度」を「B」に更新します。

回答

✦ レコードの更新が完了しました。

  念のため、更新後のレコードを表示して確度が「B」になっていることを確認します。
  
回答

✦ はい、更新後のレコードを確認しました。
  「田中マーケティングテクノロジー」(レコード番号20)の確度が「B」に更新されています。


  `json
  {
    "レコード番号": {
      "type": "RECORD_NUMBER",
      "value": "20"
    },
    "文字列__1行_": {
      "type": "SINGLE_LINE_TEXT",
      "value": "田中マーケティングテクノロジー"
    },
    "ラジオボタン": {
      "type": "RADIO_BUTTON",
      "value": "B"
    }
  }

確度変更前

image.png

確度変更後

image.png

複数のレコードの更新

複数のレコードのデータを一括で変更するタスクを与えます。特定のフィルターをかけた結果の単価のデータを変更し、それに伴って小計のデータにも影響を与えることを想定しています。小計にはkintoneの機能で単価×ユーザー数の数式が入っているため、単価を変更するのみで再計算が行われます。
このタスクについても想定通りに遂行してくれました。

プロンプト
> 案件管理アプリケーションのデータの修正依頼です。
Garoonの単価が800円から1000円になりました。
これによって単価の値と、それに伴って小計の修正が必要になりました。
全てのレコードに対して、修正をお願いします。
回答
✦ 承知いたしました。案件管理アプリにて、製品名が「Garoon」の全レコードの単価を800円から1000円に更新しますね。
  小計は単価とユーザー数から自動計算されるため、単価を更新すれば自動的に修正されます。


  まず、製品名が「Garoon」のレコードをすべて検索します。

クリックしてGemini CLIの試行錯誤を表示
回答

✦ おっと、製品名(ドロップダウン)で直接レコードを絞り込むことができないようです。


  別の方法を試します。まず、全レコードを取得してから、製品名が「Garoon」のものを探し、更新処理を行います。
  全レコードを取得します。

回答

✦ 全レコードを取得しました。
  製品名が「Garoon」のレコードを特定し、単価を「1000」に更新します。
  対象となるレコードは以下の4件です。


   * レコード番号: 21 (山根コンベア)
  これから更新処理を実行します。

回答

✦ はい、製品名が「Garoon」の全レコードの単価を1000円に更新しました。


  更新が正しく反映されているか確認のため、レコード番号「21」のデータを取得して表示します。


✦ 確認が取れました。

  レコード番号「21」(会社名:山根コンベア)のデータが、ご依頼どおりに更新されていることを確認しました。

kintone-get-records (kintone MCP Server) {"app":"3","filters":{"equals":[{"value":"21","field":"$id"}]}}

    {
      "records": [
        {
          "活動履歴": {
            "type": "SUBTABLE",
            "value": []
          },
          "レコード番号": {
            "type": "RECORD_NUMBER",
            "value": "21"
          },
          "単価": {
            "type": "NUMBER",
            "value": "1000"
          },
          "更新者": {
            "type": "MODIFIER",
            "value": {
              "code": "<my address>",
              "name": "<my name>"
            }
          },
          "ユーザー数": {
            "type": "NUMBER",
            "value": "100"
          },
          "作成者": {
            "type": "CREATOR",
            "value": {
              "code": "<my address>",
              "name": "<my name>"
            }
          },
          "文字列__1行_": {
            "type": "SINGLE_LINE_TEXT",
            "value": "山根コンベア"
          },
          "ラジオボタン": {
            "type": "RADIO_BUTTON",
            "value": "B"
          },
          "$revision": {
            "type": "__REVISION__",
            "value": "2"
          },
          "文字列__1行__0": {
            "type": "SINGLE_LINE_TEXT",
            "value": ""
          },
          "ユーザー選択": {
            "type": "USER_SELECT",
            "value": []
          },
          "文字列__1行__1": {
            "type": "SINGLE_LINE_TEXT",
            "value": "山根たかし"
          },
          "更新日時": {
            "type": "UPDATED_TIME",
            "value": "2025-10-05T15:19:00Z"
          },
          "数値_1": {
            "type": "CALC",
            "value": "100000"
          },
          "文字列__1行__4": {
            "type": "SINGLE_LINE_TEXT",
            "value": ""
          },
          "文字列__1行__5": {
            "type": "SINGLE_LINE_TEXT",
            "value": ""
          },
          "文字列__1行__3": {
            "type": "SINGLE_LINE_TEXT",
            "value": ""
          },
          "ドロップダウン_0": {
            "type": "DROP_DOWN",
            "value": "Garoon"
          },
          "日付_0": {
            "type": "DATE",
            "value": "2024-01-10"
          },
          "作成日時": {
            "type": "CREATED_TIME",
            "value": "2025-10-05T14:26:00Z"
          },
          "$id": {
            "type": "__ID__",
            "value": "21"
          }
        }
      ],
      "totalCount": "1"
    }
回答
   * 単価: 1000円
  他の「Garoon」のレコードも同様に更新されています。

以下のように、Garoonの案件の単価が変更前は800だったものが、変更後では全て1,000に変更されています。

レコード変更前

image.png

レコード変更後

image.png

数値データを取得してサマリー

アプリケーションを指定して、特定の条件でSUMIFが必要になるようなサマリータスクを与えます。とても短いプロンプトなので、ある程度自律的に計画をし、タスクを切り分けて遂行してもらう必要があります。また、最終的に集計処理が必要になるため、多少難しいタスクになります。
こちらも想定通りに遂行してくれました。

プロンプト
> 案件管理アプリの先方担当者の金額をサマリーして
回答
✦ 了解しました。案件管理アプリの先方担当者ごとの金額を集計しますね。
  まず、アプリの情報を取得します。

回答

✦ アプリが見つかりました。アプリIDは「3」です。
  次に、アプリのフィールド情報を取得して、「先方担当者」と「金額」のフィールドコードを確認します。

回答

✦ フィールド情報を確認しました。
  - 「先方担当者」のフィールドコードは 文字列__1行__1
  - 「金額」に該当するフィールドは「小計」で、フィールドコードは 数値_1


  これらの情報を元にレコードを取得し、集計します。

回答

✦ レコードの取得が完了しました。これから集計し、結果を表示します。

shell python -c "

回答

✦ 申し訳ありません。Pythonの実行環境に問題があるようです。
  再度、別の方法で集計します。
  
  先方担当者別の金額サマリー:
  小林 学: 3,000,000円
  小田桐 大地: 750,000円
  田中 浩二: 717,500円
  護国 冴子: 640,000円
  松井 義昭: 400,000円
  山田 貴文: 300,000円
  稲光 道信: 240,000円
  東坂本 裕次郎: 225,000円
  佐藤 正義: 150,000円
  石井 太郎: 80,000円
  山上 肇: 75,000円
  山田 雅子: 75,000円
  吉澤 敏夫: 75,000円
  斎藤 直樹: 22,500円
  吉高 美智子: 10,000円
  池田 翔太: 7,500円
  山田 健介: 3,900円

データ欠損のレポート

データは空白があるとデータ集計などに影響が出ることがあります。このデータの欠損問題について、AIによって現状を把握してもらい、データの欠損に関するレポートをしてもらうタスクを与えました。
想定通りにタスクを遂行してくれました。

プロンプト
> レコードの必要データがない箇所についてレポートしてください。
回答
✦ 承知いたしました。
  各レコードで、入力が漏れている可能性がある項目(データが空になっている項目)を洗い出し、レポートします。


  まず、アプリの必須項目設定を確認し、論理的に重要と思われる項目をリストアップします。
  - 確度: アプリ設定上の必須項目です。
  - 会社名: 案件管理の基本情報として重要です。
  - 先方担当者: 誰への案件かを示すために重要です。
  - 製品名: 何の案件かを明確にするために必要です。
  - 見込み時期: 売上予測に影響します。
  - 単価 / ユーザー数: 売上金額の計算に必須です。


  それでは、全レコードを取得し、上記の項目が空になっていないか確認します。

回答
✦ はい、全レコードを確認しました。
  必須項目である「確度」は、全てのレコードで入力されています。

  その他、入力が漏れている可能性がある項目について、レコードごとに報告します。


  ---
  レコード番号: 21
  - 会社名: 山根コンベア
  - 入力漏れの可能性がある項目:
      - 部署名
      - 案件担当者名
      - FAX
      - メールアドレス
      - TEL


  ---
  レコード番号: 6
  - 会社名: 稲光水産
  - 入力漏れの可能性がある項目:
      - メールアドレス

  ---


  上記以外のレコードについては、今回確認した主要な項目(会社名, 先方担当者, 製品名, 見込み時期, 単価,
  ユーザー数)は全て入力されていました。

空白があるレコードは山根コンベアと稲光水産で、レポートされたものと合致している
image.png

アプリケーションの修正

今まではアプリケーションの中のレコードについてのタスクを行ってきましたが、アプリケーション自体のフィールドを編集してもらうタスクを与えます。これができることによってイチからアプリを作ったり、想定通りに動かないアプリケーションの改修をお願いすることも期待されます。
アプリケーションの改修には色々な制約があるようで、すんなりとはいきませんでした。しかし、色々な方法を駆使して、タスクを遂行してくれました。ただし、ベストな設計、実装とは言えませんでしたが、要件を満たすという事においては問題なく遂行してくれました。
実際に利用する際にはプロンプトをもっと工夫する必要がありますが、自然言語でアプリケーションを作成することも期待が持てました。

プロンプト
  > 案件管理アプリのアプリ修正の依頼です。
    まずは売上原価の列を追加してください。
    売上原価の値はgaroonは単価に対して300円、その他は単価に対して200円です。
    次に粗利の列を追加し、売上高-売上原価で粗利を自動計算するように設定してください。
回答
✦ 承知いたしました。案件管理アプリの修正、承ります。
  ご依頼内容は以下の通りですね。


   1. 「売上原価」列(フィールド)を追加する。
  まずは、アプリに「売上原価」と「粗利」の新しいフィールドを追加します。

クリックしてGemini CLIの試行錯誤を表示
回答

✦ フィールドの追加が完了しました。現在、アプリの設定が変更されたプレビュー状態です。
  この変更を本番環境に反映させるため、アプリをデプロイ(配備)します。これには少し時間がかかる場合があります。

回答

✦ デプロイを開始しました。
  処理が完了したか、ステータスを確認します。

回答

✦ デプロイが成功しました。新しいフィールドがアプリに追加されています。


  次に、既存の全レコードに対して、「売上原価」の値を設定します。
  まず、全レコードの情報を取得します。

回答

✦ レコードの取得が完了しました。
  これから、各レコードの製品名に応じて「売上原価」の値を設定します。

  -   製品名が「Garoon」の場合: 売上原価 = 300円
  -   それ以外の場合: 売上原価 = 200円


  このルールで全レコードを更新します。

回答

✦ 全レコードの「売上原価」を更新しました。
  これにより、「粗利」も自動で計算されているはずです。

  最後に、変更が正しく反映されているか、代表的なレコードをいくつか確認してみましょう。


   - レコード21(製品名: Garoon)
  これらのレコードの金額関連の項目を表示します。

回答

✦ アプリの修正、およびデータ更新が完了しました。
  更新内容の確認のため、製品名が「Garoon」と「kintone」のレコードを1件ずつ取得しました。


  ---
  レコード番号: 21
  -   製品名: Garoon
  -   単価: 1,000
  -   ユーザー数: 100
  -   小計 (売上高): 100,000
  -   売上原価: 300
  -   粗利 (小計 - 売上原価): 99,700


  ---
  レコード番号: 20
  -   製品名: kintone
  -   単価: 1,500
  -   ユーザー数: 30
  -   小計 (売上高): 45,000
  -   売上原価: 200
  -   粗利 (小計 - 売上原価): 44,800

  ---

  ご確認ありがとうございます。
  ここで一点、私の解釈に誤りがあったかもしれません。


  ご依頼の「売上原価の値はgaroonは単価に対して300円、その他は単価に対して200円です」という部分を、私は「レコードごとに固定で300円または200円」と解釈して設定しました。


  しかし、正しくは「ユーザー数1人あたりの原価が300円または200円」という意味でしたでしょうか?

  もし後者の場合、ただ今の計算(例:粗利 99,700円)は意図と異なっているかと存じます。
  その場合、正しく「(単価 - 原価)×
  ユーザー数」で粗利が計算されるよう、アプリのフィールド設定を再度修正する必要がございます。


  お手数ですが、どちらの計算が正しいかご教示いただけますでしょうか。

以下のように変更前には存在しなかった粗利、売上原価のフィールドが容易されています。また、粗利の中には計算式が入っており、機能追加するという要件は満たされています。

変更前
image.png

変更後
image.png

粗利と売上原価カラムが追加されている様子
image.png

今回は間違った計算でアプリの修正が行われてしまいましたが、アプリの修正を自律的にやってくれるという目標は達成しました。これ以上は長くなってしまうので、本記事内では一旦ここまでにします。

以下の記事にて解決まで行ったので、気になる方はこちらから見てください。

まとめ

本記事では、kintone MCP を用いて何ができるかを検証し、以下の操作が可能であることを確認しました。

  1. アプリケーションの確認
  2. レコードの取得
  3. レコードの追加
  4. レコードのフィルター取得
  5. レコードの更新
  6. 複数レコードの一括更新
  7. 数値データの取得とサマリー作成
  8. 欠損データのレポート
  9. アプリケーションの修正

結果として、9項目の「アプリケーションの修正」では一部手間取ったものの、その他の指示は概ね問題なく実行できました(詳細は長くなるため本記事では割愛しますが、別記事で最終的な完了までの流れを公開しています)。また、7項目以降のように AI の自律性が求められるタスクについても、解決に向けた計画を立て、着実に実行できました。

kintone は非エンジニアでも扱いやすいプラットフォームですが、MCP を組み合わせることで、アプリの作成・操作をさらに簡単にできると感じました。

私は kintone の専門家ではないため、Gemini CLI が自動修正したアプリ設計の良否を厳密に評価できてはいません。とはいえ、まず「動くもの」を素早く用意するという観点では非常に有用なツールだと感じています。今回は機能検証として単体機能を中心に試しましたが、今後はアプリ作成を一連の流れで任せる実験や、本職であるセキュリティの観点からの検討も深掘りできたらいいなと考えています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?