Mấy hôm nay chuyển từ VSCode sang sử dụng Zed vì một số lý do. Zed là một trình soạn thảo mã viết bằng Rust rất nhẹ và có giao diện tương đồng với VSCode ở nhiều chỗ. Tuy vậy Zed vẫn có những điểm khác biệt và đi theo triết lý riêng của họ. Cá nhân mình đã sử dụng Zed từ những ngày đầu ra mắt, ấn tượng ban đầu là rất nhanh và mượt. Tuy nhiên rất nhiều tính năng quen dùng trên VSCode lại không có trên Zed nên chỉ dừng lại ở mức trải nghiệm.
Một trong những tính năng mình thường xuyên sử dụng là debug bằng breakpoint, chọn vị trí rồi quan sát luồng dữ liệu trong hệ thống. VSCode là trình soạn thảo phổ biến cho nên bật debug dễ dàng hơn nhiều. Thường chỉ mất vài thao tác, đặc biệt nếu sử dụng framework thì bạn còn dễ dàng tìm thấy hướng dẫn trên mạng. Nói chung là VSCode làm rất tốt việc tối giản cho người sử dụng.
Vì vậy sau khi chuyển... Xem thêm
Đây có thể là bài viết cuối cùng của chuỗi MCP cơ bản trong chuyên mục Posts của blog. Đúng ra dự định không viết thêm nữa do Prompts & Resources trong MCP có tài liệu rất hạn chế, nhưng vì đây là hai phần thú vị nên giới thiệu chúng đến bạn đọc.
Mình đã đọc và nghiên cứu tài liệu về hai mục này trên trang chủ của MCP, sau khi hiểu được nguyên tắc và trường hợp sử dụng thì sau đó có đi tìm một số dự án đã tích hợp với dự định bổ sung thêm ví dụ trong bài viết, nhưng xem ra rất ít dự án triển khai hai thành phần này. Tại sao?
Theo quan điểm cá nhân... Xem thêm
Bạn có thích viết tài liệu không? Hay thích viết mã hơn? Khi nhận yêu cầu, bạn thường suy nghĩ luôn giải pháp, rằng mình sẽ làm như này, viết như này, từng dòng if...else hiện ra một cách tự nhiên trong đầu, hay nghĩ về nghiệp vụ, những phần có liên quan hoặc thay đổi có ảnh hưởng gì đến cái hiện có trong hệ thống không?
Từ lúc mới biết lập trình, tôi không có khái niệm về viết tài liệu, thậm chí đọc tài liệu cũng không. Tất cả những gì làm là đọc bài viết từ người khác, được họ chỉ cho từng bước làm thế này, sau đó chỉ cần làm theo là được. Nếu gặp khó khăn thì tìm kiếm trên mạng không mất quá nhiều thời gian. Tóm lại là chỉ cần đủ, không cần thừa, còn lại nhờ thời gian tích luỹ thêm kinh nghiệm cho ta.
Điều đó đeo bám một... Xem thêm
Ở bài viết trước chúng ta đã xây dựng được một máy khách MCP đơn giản, tuy nhiên phần mã nhiều hơn và phức tạp hơn. Để cho bạn đọc có thể hình dung thì cách đơn giản để hiểu chương trình là xem luồng dữ liệu đang được xử lý bên trong đó, xem xem tại vị trí này đang có giá trị là gì và tại sao lại cần phải gọi nó... Hay nói tóm tắt là đặt debug.
Thông thường nếu dùng Framework nào đó để phát triển ứng dụng, thường thì họ tích hợp luôn cả hướng dẫn debug, khi đó chỉ cần đọc tài liệu rồi làm theo hướng dẫn. Nhưng đối với chuỗi ví dụ về xây dựng máy chủ MCP cho 2coffee.dev được phát triển từ đầu bằng TypeScript, không sử dụng một khung có sẵn nào cả cho nên không có phần debug. Vậy nên hướng dẫn này dành cho bạn đọc cách thiết lập gỡ lỗi trong trình soạn thảo mã VSCode.
Đầu tiên hãy nắm được... Xem thêm
Ở phần 2 này chúng ta hãy cùng nhau tạo một máy khách đơn giản có thể tương tác qua công cụ dòng lệnh (cli), tức là viết một ứng dụng dòng lệnh. Đầu vào là yêu cầu của người dùng và kết quả đầu ra là ứng dụng gọi đúng hàm có trong MCP Server rồi phản hồi kết quả. Để cho đơn giản, hãy tận dụng máy chủ MCP 2coffee.dev mà chúng ta đã tạo ở các bài viết trường, các bạn có thể tham khảo mã nguồn tại Tạo một MCP Server đơn giản cho 2coffee.dev.
Trên tài liệu của Anthropic có bài viết hướng dẫn cách tạo MCP client tận dụng thư viện @anthropic-ai/sdk của họ. Tuy nhiên thư viện này chỉ tương thích với các model của Anthropic, cho nên chúng ta không làm theo cách đó mà tận dụng các mô hình LLMs cục bộ thông qua công cụ LM Studio. LM Studio hỗ trợ một số API tuân theo chuẩn của OpenAI cho nên hoàn toàn có thể sử dụng thư viện openai thay thế cho @anthropic-ai/sdk.
Đầu tiên khởi động LM... Xem thêm
Xây dựng một máy khách MCP cơ bản không khó, nhưng trước tiên để làm được bất kỳ điều gì thì chúng ta cần phải hiểu được cách nó hoạt động. Máy khách MCP cần phải có cơ chế phối hợp nhịp nhàng với máy chủ MCP, và đó là đặc tả của MCP.
Về cơ bản quá trình giao tiếp giữa máy khách với máy chủ diễn ra như sau. Ở đây mình xin phép lược bớt các thành phần như xác thực, khám phá danh sách prompts, danh sách tài nguyên... mà máy chủ cung cấp. Thay vào đó tập trung vào một luồng chính cơ bản tức lúc nhập một yêu cầu ra lệnh, đến lúc thực thi và cho đến khi nhận được kết quả.... Xem thêm
Mediator là một mẫu thiết kế hệ thống giúp giảm thiểu sự phụ thuộc hỗn loạn giữa các đối tượng, bằng cách áp dụng biện pháp hạn chế giao tiếp trực tiếp giữa các đối tượng mà buộc chúng phải thông qua một đối tượng trung gian.
Ban đầu khi chưa biết đến khái niệm này mình có kiểu viết mã rất "hỗn loạn" trong cả Front-end lẫn Back-end. Các thành phần trong hệ thống đôi khi không hoạt động độc lập mà chúng còn tương tác với nhau, chính việc tương tác này gây ra nhiều khó khăn trong quá trình gỡ lỗi và bảo trì. Để mình lấy lần lượt từng ví dụ cho mọi người dễ hình dung.
Đầu tiên là ở phía... Xem thêm
Xin chào! Lâu lắm rồi chúng ta mới quay lại chuỗi bài viết về xây dựng máy chủ MCP. Thời gian vừa qua do có nhiều công việc nên hôm nay tôi mới để dành ra được thời gian mà viết tiếp.
Đặc tả MCP nêu rất rõ cơ chế xác thực nên dùng cho một máy chủ MCP remote. Về cơ bản đó là quy trình xác thực theo đặc tả Oauth 2.1. Nói tóm tắt thì có các bước như sau:
Bước 1: Máy khách tự... Xem thêm
Sự kiện các gói trên npm liên tục bị tấn công trong thời gian qua gây ảnh hưởng không nhỏ đến cộng đồng, khiến cho chúng ta nghi ngờ cả khả năng bảo mật của các thư viện mà đang sử dụng, dù là trong môi trường phát triển (development) hay môi trường sản xuất (production).
Thực tế ngay từ ngày đầu mới biết đến Node.js, npmjs... mình thấy mỗi khi chạy npm install xong thì xuất hiện thư mục node_modules và tệp package-lock.json. Tò mò mở ra thì ôi thôi, sao mà nó chứa nhiều thư mục khác quá vậy, trong khi nếu mở package.json ra chỉ thấy cài mỗi thư viện express 🤔. Điều đó có nghĩa cài express thì nó sẽ tự cài một đống gói, hay nói cách khác express đang phụ thuộc vào các gói khác, các gói đó lại tiếp tục phụ thuộc vào gói khác nữa dẫn đến một "địa ngục" phụ thuộc. Điều đó giải thích cho việc tại sao cài một thư viện thôi mà xuất hiện hàng tá thư viện chưa bao giờ nhìn thấy.
Có một điều khá thú... Xem thêm
Trong phần 1 chúng ta đã triển khai máy chủ MCP remote với giao thức cũ SSE. Phần 2 này tiếp tục triển khai giao thức mới hơn: MCP.
Cách triển khai rất đơn giản tương tự như SSE, chỉ có điều cần triển khai 3 điểm cuối cùng tên.
Đầu tiên khai báo một... Xem thêm