Please read this section at least one day prior to the seminar. This section outlines what you are expected to know, be able to do, or prepare in advance. Following these instructions will help you get the most out of the seminar and ensure smooth participation.
This is a remote practical. There is no on-site activity. Instead, you are expected to solve the assignments in the time and place of your choosing. Unless stated otherwise, you are expected to work alone. You are not allowed to share your solution with your colleagues. Each assignment has a specific deadline and submission conditions.
You are not allowed to collaborate with your colleagues.
Avoid over-reliance on AI tools for implementing this assignment.
You are required to finish all exercises, commit and push your solution before 2026-05-31 23:59 (UTC+1).
This practical is designed as a series of exercises that build on each other. You are expected to solve the exercises in the given order. Each exercise should be its own project. It is a good idea to commit after each exercise.
If you are up for a challenge you can implement all assignments on your own. Alternatively you can wait till end of the week as I plan to prepare a video walkthrough for this practical. The idea is to provide you with some baseline as some of you pointed out, that the lack of guidance can significantly increase the complexity and workload.
If you decide to watch the video please keep in mind that it focus only on the main idea. That is why, I decided to cut corners when it comes to quality. From the video you can see I struggle a lot with typing. If you have a similar skill issue, you can download the final code instead of typing it on your own.
We start with a simple application exposing RESTful API for a library.
./practical-12/restful/
The first task is to implement a simple RESTful API with in-memory storage. The application must be implemented using Node.js with Express, Morgan, and Ajv. The application must expose the following endpoints:
A book data transfer object (DTO) returned by the /api/v1/books/:book or sent to /api/v1/books must satisfy book JSON schema.
All data should be stored in-memory, there is no persistence layer.
Continue to the next slide once you are done >>>
Make sure that your application logs requests and is of a reasonable quality. Do not forget to test your application!
Your application must use the following environment variables:
Your application must be executable using the following commands with environment variable set.
npm ci
npm run start
Congratulations, if you have followed the instructions, you have just reached the end of this exercise.
Next, we build a GraphQL endpoint on top of our RESTful API.
./practical-12/graphql/
The application should provide a GraphQL endpoint implementing book schema. The GraphQL endpoint must be available at /graphql. To improve user experience we also need to serve a GraphQL client at / .
You have to utilize Ruru server as a distribution of GraphiQl. To handle GraphQL use graphql processing library. Use graphql-http to connect GraphQL processing library with HTTP.
The application must be stateless, all requests must be handled by calling API from the previous assignment.
Continue to the next slide once you are done >>>
Make sure that your application logs requests and is of a reasonable quality. Do not forget to test your application!
Your application must use the following environment variables:
Your application must be executable using the following commands with environment variable set.
npm ci
npm run start
Congratulations, if you have followed the instructions, you have just reached the end of this exercise.
Finally we expose selected functionality using Model Context Protocol (MCP).
./practical-12/model-context-protocol/
The aim is to expose selected functionality from previous applications using Model Context Protocol. We build on Build an MCP server tutorial. Yet, unlike in the tutorial we expose the MCP using HTTP instead of standard input and output. To keep it simple your application should be stateless. The application must expose following tools:
You are free to interact with the RESTful and GraphQL applications.
Continue to the next slide once you are done >>>
Make sure that your application logs requests and is of a reasonable quality. Do not forget to test your application!
Your application must use the following environment variables:
Your application must be executable using the following commands with environment variable set.
npm ci
npm run start
Congratulations, if you have followed the instructions, you have just reached the end of this exercise.
With all three applications finished, now it is time to make it personal.
./practical-12/README.md
Think of any extension to the implemented applications. Once you made your choice, describe it in the ./practical-12/README.md and implement it. The description should explain the purpose of the extension, how to use it, and why you chose it.
The extension may be a new endpoint, new tool, extended schema. It can also focus on quality, e.g. error handling, tests, ...